2011-08-04 12 views
2

私はこのように私のアルゴリズムを定義する抽象クラスを使用して、テンプレートのデザインパターンを使用しようとしています:私のコードでjvmが抽象クラスからクラスオブジェクトを作成するのは高価ですか?

abstract class MyTemplate 
{ 
    public void execute() 
    { 
     //... do something 
     doSomething(); 
    } 
    public abstract void doSomethig(); 
} 

私はこのようなinstanceofはMyTemplateに毎回を作成します。

MyTemplate cleanUp = new MyTemplate() 
{ 

public void doSomething() 
{ 
// execute cleanup 
} 
} 
cleanUp.execute(); 

されていますJVMのために高価な抽象クラスからオブジェクトを作成していますか?

おかげで、

ショーン・グエンは

+0

あなたのパフォーマンスにはどのような影響がありますか?このパターンは、常にJavaで使用される匿名の内部クラスと変わりません。 –

答えて

4

あなたは抽象クラスインスタンスを実際に作成していません。 Javaコンパイラによって作成された、コード内に名前を持たない具体的なクラスのインスタンスを作成しています。

JVMは実際にそのことを知らないか気にしません。そのため、抽象クラスのサブクラスである他のクラスのインスタンスを作成する場合と同じくらい高価です。だから汗をかくことはありません:)

3

内部的には、JVMは、Javaコンパイラを使用すると、オンザフライで作成された匿名クラスのための新しいの.classファイルを作成することによって、この動作を実装し、その後、新しいをインスタンス化そのタイプのオブジェクト。したがって、新しいクラスをJVMにロードするためには(わずかな)1回限りのコストがありますが、その時点から新しいオブジェクトを作成するコストは他のオブジェクトを作成するコストと同じです。

つまり、いいえ、このコードでは大きな非効率性が導入されていません。

6

いいえ、コンパイラは、コンパイル時に匿名の内部クラスを生成します。このクラスのオブジェクトをインスタンス化することは、他のクラスよりも高価ではありません。

関連する問題