2016-06-25 12 views
-1

からの "this"オブジェクトへの参照を使用するこのコードは何をするのかと尋ねられますが、実際には分かりません。 私はnetbeansでそれを実行しようとしましたが、答えは6でしたが、なぜ本当に理解できません。メンバ変数

public class Quattro { 
    int x = 5; 
    Quattro s = this; 
    Quattro f(){ 
     s.s.s.x++; 
     return s; 
    } 
    void g(){System.out.println(x);} 
    public static void main (String[] args){ 
     Quattro a4 = new Quattro(); 
     a4.f().g(); 
    } 
} 

質問1:Quattro s = this;は何をしますか?私は自分自身へのポインタを宣言していますか?もしそうなら、それは私が

Quattro f(){ 
      s.s.s.x++; 
      return s; 
     } 

あるいは

Quattro f(){ 
      s.s.s.s.s.s.s.s.x++; 
      return s; 
     } 

を書くことができ、私はループにいるので、私はいつも同じ結果を得るだろうことを意味しますか?

質問2:私はa4.f().g();が何をしているのか分かりません...私にはとても奇妙なようです。

+0

質問で2つの質問をしているので、この質問を議論の対象外としています。 – stackptr

答えて

1

メンバー変数にthisという参照を割り当てると、再帰があります。はい、それはいつも同じオブジェクト、thisオブジェクトですので、どれくらい多くのsを追加するかは関係ありません。その上で、いくつかの他の操作を行った後thisオブジェクトへの参照を返しますf()

this.this.this.this.this.this.x++; 

機能:あなたが書いたかのように、それは同じです。 builderというJavaの一般的なデザインパターンです。 a4.f().g();をクラスに追加する機能は、method chainingと呼ばれます。

a1.f().f().f().f().f().f(); 

そして、それはあなただけa1オブジェクトから6回f()関数を呼び出した意味:他の言葉では、f()は、コールの終了時にthisオブジェクトである、ちょうどsようにあなたが行うことができますので、です。

+1

BuilderはFluent APIと呼ばれるパターンの単一ユースケースであり、このコードはビルダーではありません。 –

+0

さて、 'f()'を何度呼び出すかによって、** 's'変数が明確に**構築されます。 [GsonBuilder](https://google.github.io/gson/apidocs/com/google/gson/GsonBuilder.html)もビルダーの良い例です。このクラスには欠けているのはビルダーとビルドされたオブジェクトの区別です。それは自分自身を構築するビルダーです(; – Jezor

+0

)。突然変異は構築ではありません。概念の本質を取り除くことはできず、まだそこにあるふりをすることはできません。 –

関連する問題