2015-01-06 6 views
7

私は仕事中にこのコードを見ただけで、著者はインライン最適化のためだと教えてくれました。Javaインライン最適化はこれが正しいですか?

Class Test{ 
... 
void init(){ 
    //sets variables, call functions, etc 
} 
... 
} 

はその後、彼は代わりにその中には、init()からのコードでデフォルトコンストラクタを持つのこの

Test t=new Test(); 
t.init(); 

のようにメインでそれを呼び出します。彼はそれがインライン最適化のためだと言いました。 これが正しいですか?どのように高速ですか?これについて私はどこで読むのですか?

+4

著者に質問してください。 –

+4

コード内に何も最適化するものはありません。 – Maroun

+0

どうしたらいいですか? – Natix

答えて

14

これは高速ではありません。メソッドがインライン化できるが、コンストラクタではできないという前提に基づいているようです。残念ながら、それはナンセンスなので、その全体が窓から出て行きます。

これが高速だったとしても、ほぼ確実に悪い考えです。最後のCPUサイクルがすべて重要である極端な状況を除いて、コードを読みやすくする必要はありません。その場合、Javaを使用する可能性は低いです。

実際、これは単に読みにくいよりも悪いです。次のリファクタリングは、必ずTestコンストラクタがinit()メソッドを呼び出すためのものであるため、手動で行う必要はありません(手動で行うことは忘れてしまうと痛みやバグの原因になります)。コンストラクタがオーバーライド可能なメソッドを呼び出すと、スーパークラスのコンストラクタが呼び出されたときに発生したことをサブクラスが誤って変更する可能性があります(詳細はthis questionを参照してください)。この場合、同一パッケージ内Testのサブクラスは、init()メソッドをオーバーライドすることができますし、サブクラスが暗黙的または明示的に、super()を呼び出したときに、スーパークラスのコンストラクタはinit()を上書きを呼び出すことになります。 (この特定の問題は、をprivateと宣言することで取り除くことができます)

しないでください。

+0

コンストラクタが2つあった場合はどうなりますか?両方ともinitメソッドと呼ばれる場合、読みやすくなります。 – JClassic

+0

_ 'init'メソッドは何もマルチスレッド化していません(' this'を他のスレッドのリスナーとして登録する、 'this'などについて知っている新しいスレッドを開始するなど)。 )、この場合、スレッドの安全性のために 'init()'を別々に保つ必要があります。 – yshavit

+2

@JClassicこれを処理するうまい方法の1つは、 "標準的な"コンストラクタを作成し(必要であればプライベートにする)、他のコンストラクタで 'this(someArg、anotherArg、maybeSomeArg + 42)'を使って呼び出すことです。 – yshavit

1

私は最適化するものはないと思います。つまり、クラスの初期化は各クラスが単独で行う必要があるため、デザインフェーズでは良い考えではないとも言えます。別々の方法では、そのような行動を置く:、順番にも

を上書きすることができます

  1. 個別に呼び出す必要があり、通常は推奨されないものです。

関連する問題