重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

Javaのabstractメソッドは、確か中身がないメソッドということで、オーバーライドしないと呼び出すことができないんではなかったでしょうか・・。

それなのに、javax.xml.DocumentBuilderFactoryクラスのnewDocumentBuilderメソッドって、abstract宣言でも呼び出したらちゃんとDocumentBuilderが返るみたいなんですけど、これ如何に。

A 回答 (1件)

>Javaのabstractメソッドは、確か中身がないメソッドということで、オーバーライドし


>ないと呼び出すことができないんではなかったでしょうか・・。

確かに、
DocumentBuilder db = new DocumentBuilder();
みたいな書き方はできません。
ただ、例えばDocumentBuilderImplという、「DocumentBuilderを継承した」
(抽象クラスでない)普通のクラスがあったとすると、
DocumentBuilder db = new DocumentBuilderImpl();
みたいな書き方はできます。
javax.xml.DocumentBuilderFactoryクラスのnewDocumentBuilderメソッドは、
これと同じようなことを内部的にやってるのです。
実際に中身がどういうものか分からないけど、DocumentBuilderを継承した
クラスのインスタンスを返す、ということをこのメソッドはやってるのです。

何でこんな回りくどいことをしてるかというと、
例えばXMLの仕様が大きく変わり、今のDocumentBuilderImplクラスでは
対応できなくなってDocumentBuilderImpl2というクラスを作ったとします。
すると、このクラスを使ってる人に、
DocumentBuilder db = new DocumentBuilderImpl();

DocumentBuilder db = new DocumentBuilderImpl2();
という風にすべて変更してもらわないといけなくなります。
APIのようにたくさんの人が使うようなものの場合、これだとうかつに更新できません。

一方、javax.xml.DocumentBuilderFactoryクラスの場合は、
このクラスを使ってる人はnewDocumentBuilderメソッドを読んでるだけです。
なので、中身の部分だけがこっそり差し替わっていれば、
newDocumentBuilderメソッドは何も触らなくてよいのです。

こういうお決まりのテクニックのようなものを「パターン」と呼んでいて、
今回のは「Factoryパターン」という名前がついてます。
「デザインパターン」とか「GoF」とかで調べるとこういうテクニックがいっぱいあります。
    • good
    • 0
この回答へのお礼

お答えありがとうございます。

DocumentBuilderFactoryクラス自身で実際にDocumentBuilderオブジェクトを作成する処理がかかれておらず、jvmの環境変数やクラスパスを調べてDocumentBuilderImplクラスなどを見つけ出し、それを利用しているから、abstract・・・ということですよね。(自分の考え入ってますけど。)

なんだか途中からそんなこと思ってたんですよね・・。
(質問からけっこう日が経ってるのでだんだんと。)

でも、やっぱり人の言葉で聞くと、納得ができますし、
半信半疑よりも素直に頭に取り込むことができます。
その意味でも、有意義な質問だったと思います。
ありがとうございました。

お礼日時:2007/08/14 23:25

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!