1

これらは、 https://github.com/SpringSource/spring-amqp-samples.gitにあるgithubのSpring amqpサンプルからの ものです。これらはどのタイプのJavaコンストラクターですか?彼らはゲッターとセッターの速記ですか?

public class Quote {

    public Quote() {
        this(null, null);
    }

    public Quote(Stock stock, String price) {
        this(stock, price, new Date().getTime());
    }

これとは反対に

public class Bicycle {

public Bicycle(int startCadence, int startSpeed, int startGear) {
    gear = startGear;
    cadence = startCadence;
    speed = startSpeed;
}
4

3 に答える 3

6

これらのコンストラクターは、を使用して別のコンストラクターを呼び出すためにオーバーロードされますthis(...)。最初の引数なしコンストラクターは、null引数を使用して2番目を呼び出します。2番目は3番目のコンストラクター(図には示されていません)を呼び出します。このコンストラクターは、、、、およびをとる必要がStockありStringますlongコンストラクタチェーンと呼ばれるこのパターンは、重複コードなしでオブジェクトをインスタンス化する複数の方法を提供するためによく使用されます。引数の数が少ないコンストラクターは、不足している引数をwithなどのデフォルト値で埋めるnew Date().getTime()か、sを渡しnullます。

を呼び出さず、代わりにコンストラクターの実装が続く呼び出しを提供するコンストラクターが少なくとも1つ存在する必要があることに注意してください。コンストラクターの最初の行でどちらも指定されていない場合、引数なしの呼び出しが暗黙指定されます。this(...)super(...)this(...)super(...)super()

したがって、クラスにこれ以上コンストラクターチェーンがないと仮定するとQuote、3番目のコンストラクターはおそらく次のようになります。

public Quote(Stock stock, String price, long timeInMillis) {
    //implied call to super() - the default constructor of the Object class

    //constructor implementation
    this.stock = stock;
    this.price = price;
    this.timeInMillis = timeInMillis;
}

this(...)また、への呼び出しの後に実装を続けることができますが、これは連鎖パターンから逸脱していることに注意してください。

public Quote(Stock stock, String price) {
    this(stock, price, new Date().getTime());

    anotherField = extraCalculation(stock);
}
于 2012-02-09T02:25:56.017 に答える
1

これが私たちが伸縮パターンと呼んでいるものです。ただし、Quoteクラスで使用した方法は役に立ちません。たとえば、クラスに1つの必須プロパティと2つのオプションプロパティがあるとします。この場合、必要なプロパティをコンストラクターに提供する必要があります。次に、そのコンストラクター内で、オプションのパラメーターのデフォルト値を使用して他のコンストラクターを呼び出す必要があります。

// Telescoping constructor pattern - does not scale well!
public class NutritionFacts {
private final int servingSize; // (mL)  required
private final int servings; // (per container) required
private final int calories; //  optional
private final int fat; // (g) optional
private final int sodium; // (mg) optional
private final int carbohydrate; // (g)   optional
public NutritionFacts(int servingSize, int servings) {
this(servingSize, servings, 0);
}
public NutritionFacts(int servingSize, int servings,
int calories) {
this(servingSize, servings, calories, 0);
}
public NutritionFacts(int servingSize, int servings,
int calories, int fat) {
this(servingSize, servings, calories, fat, 0);
}

このJavaコードを効果的なJavaエディション2から抽出します。

于 2012-02-09T03:12:31.180 に答える
0

整数の引数を取るコンストラクターを呼び出しています。

これは、JavaチュートリアルのWebページで見つけたものです。

これを使用して、インスタンスメソッドまたはコンストラクター内から現在のオブジェクトの任意のメンバーを参照できます。

この場合、ArrayListクラスから何かを呼び出しています。これは、Javaチュートリアルセクションにもありました。

コンストラクター内から、thisキーワードを使用して、同じクラスの別のコンストラクターを呼び出すこともできます。これを行うことは、明示的なコンストラクター呼び出しと呼ばれます。

したがって、この場合に表示されるのは、明示的なコンストラクターの呼び出しです。

ソース:https ://docs.oracle.com/javase/tutorial/java/javaOO/thiskey.html

于 2016-03-10T21:48:32.477 に答える