2016-09-23 4 views
0

私は天気について読んでいましたが、このSO pageのコンストラクタからセッターを呼び出すのは良い習慣ではありません。私はあなたのコンストラクタから非最終メソッドを呼び出すべきではないことを知っています。答えの一つが示唆:トラブルの理解 "このリファレンスの漏洩"

コンストラクタが が完全に初期化されたインスタンスの前に、この漏れは慎重でなければなりません。

私は上の引用が何を意味するのか完全に理解していません。私は次のクラスがあるとします。インスタンスが完全に作成される前に、単なる例として

public final class Employee 
{ 
    private String empID; 
    private String empFirstName; 
    private String empLastName; 

    public Employee(String ID, String FirstName, String LastName) 
    { 
     //Call to other setters left out. 
     this.setEmployeeLastName(LastName); 

    } 

    //empID, empFirstName setter left out. 
    public void setEmployeeLastName(String lastname) 
    { 
     this.empLastName = lastname; 
    } 
} 
  1. を、どのように私はこのリファレンスを漏らすでしょうか?それはオブジェクトが引数としてを渡すことを意味するのですか?が作成されていますか?
+0

あなたのクラスは最終的なので、すべてのメソッドは暗黙的に最終的なので、あなたのメソッドを宣言する必要はありません。この場合はsetEmployeeLastName finalを指定してください。 –

+0

@Gimby - 良いアドバイス、今編集中です。 – AnnabelleRosemond

答えて

1

漏洩thisの参照は完全に初期化する必要があるように見えることがあり、その事実を容易に隠すことができるため危険です。ここでは、サブクラス化を使用して問題となる可能性がある方法の例です:Barの新しいインスタンスをインスタンス化する際に

class Foo{ 
    Foo(){ 
     doStuff(); 
    } 
    void doStuff(){} 
} 

class Bar extends Foo{ 
    private int i = 1; 
    @Override 
    public void doStuff(){ 
     System.out.println(i); 
    } 
} 

あなたはそれが1を表示するだろうと、思うだろう。しかし、代わりにと表示されます。Barコンストラクタが実行される前にメソッドが呼び出されるため、iの値がまだ設定されていません。これは、漏れのあるthisが、他の点ではうまくいくようなコードに逆戻りする可能性のある例の1つです。

2番目の質問では、finalまたはprivateメソッドを呼び出すことは、ほとんど常にコンストラクタで有効です。唯一の例外は、初期化される値に依存するメソッドを呼び出す場合で、初期化が行われる前にメソッドが呼び出された場合です。しかし、あなたのセッターはどの州にも依存していないので、そうではありません。また、サブクラスで変更することはできません(最終的なので変更することはできません)。

関連する問題