
No.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」とかで調べるとこういうテクニックがいっぱいあります。
お答えありがとうございます。
DocumentBuilderFactoryクラス自身で実際にDocumentBuilderオブジェクトを作成する処理がかかれておらず、jvmの環境変数やクラスパスを調べてDocumentBuilderImplクラスなどを見つけ出し、それを利用しているから、abstract・・・ということですよね。(自分の考え入ってますけど。)
なんだか途中からそんなこと思ってたんですよね・・。
(質問からけっこう日が経ってるのでだんだんと。)
でも、やっぱり人の言葉で聞くと、納得ができますし、
半信半疑よりも素直に頭に取り込むことができます。
その意味でも、有意義な質問だったと思います。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
スーパークラスからサブクラス...
-
abstract と static を一緒に付...
-
Java初級 引数に適用できません
-
別クラスのmainメソッドの実行
-
java ジェネリックスに関して
-
非静的 public final フィール...
-
C# でメソッドに送られてきたOb...
-
Strutsでチェックボックスの値...
-
StringBufferからStringへキャ...
-
C言語での文字列より値を抜き出す
-
String.containsの反対機能はあ...
-
java.io.File クラスについて
-
「タイプ初期化子が例外をスロ...
-
UMLのクラス図はmain()も含むん...
-
変数名の付け方
-
エクセルVBAで、条件に一致する...
-
C# インスタンスの破棄
-
VB.NETでフォーム上にExcelのよ...
-
java eclipse 型に解決できません
-
private static という変数の修飾
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
レコード件数の表示
-
Java初級 引数に適用できません
-
String.containsの反対機能はあ...
-
StringBufferからStringへキャ...
-
abstract と static を一緒に付...
-
return new使用時
-
なぜprotected overrideなのか
-
C# 点の描き方をおしえてくだ...
-
C言語での文字列より値を抜き出す
-
スーパークラスからサブクラス...
-
説明文書でのメソッド・変数の...
-
別クラスのmainメソッドの実行
-
Strutsでチェックボックスの値...
-
CSVから読み込んだデータの保持...
-
Javaの関数名が長い?
-
シェルスクリプトからのJavaメ...
-
Java初心者です、エラーの意味...
-
java ジェネリックスに関して
-
C# でメソッドに送られてきたOb...
-
Java初心者です。例外のキャッ...
おすすめ情報