Calling multiple methods in Java

I found a new way to call several methods in Java, and I really don't understand what is going on behind it:

public class NutritionFacts {
private final int servingSize;
private final int servings;
private final int calories;
private final int fat;
private final int sodium;
private final int carbohydrate;

public static class Builder {
    // Required parameters
    private final int servingSize;
    private final int servings;
    // Optional parameters - initialized to default values
    private int calories      = 0;
    private int fat           = 0;
    private int carbohydrate  = 0;
    private int sodium        = 0;
    public Builder(int servingSize, int servings) {
        this.servingSize = servingSize;
        this.servings    = servings;
    }
        public Builder calories(int val)
            { calories = val;      return this; }
        public Builder fat(int val)
            { fat = val;           return this; }
        public Builder carbohydrate(int val)
            { carbohydrate = val;  return this; }
        public Builder sodium(int val)
            { sodium = val;        return this; }
        public NutritionFacts build() {
            return new NutritionFacts(this);
        }
}  

    private NutritionFacts(Builder builder) {
        servingSize  = builder.servingSize;
        servings     = builder.servings;
        calories     = builder.calories;
    }

}

Now the class is created using this line, and here, where it gets confused:

NutritionFacts cocaCola = new NutritionFacts.Builder(240, 8).calories(100).sodium(35).carbohydrate(27).build();

Everything makes sense as long as NutritionFacts.Build (int, int), after that, what exactly happens? Why methods calories, sodium, carbohydrateof the Builder must return this? Where is this class address located?

Thank!

+5
source share
4 answers

He does not "penetrate" anything.

. this. , calories() carbohydrates().

foo.calories(12) , : foo.calories(12).sodium(35).

" " , . , - .

:

Builder foo = new Builder(1, 2); // The "return" value of a ctor is the reference, foo
foo.sodium(10);   // Returns foo, but we ignore it
foo.calories(42); // Returns foo, but we ignore it

(foo.sodium(10)).calories(42);
^^^^^^^^^^^^^^^^ foo, with the side effect of setting the sodium value

SO .

+9

" ", . , - :

NutritionFacts cocaCola = new NutritionFacts(240, 8, 100, 35, 27);

..., , . - :

NutritionFacts cocaCola = new NutritionFacts(240, 8);
cocaCola.setCalories(100);
cocaCola.setSodium(35);
cocaCola.setCarbohydrates(27);

... : -, " fluent" , -, ( , ), , calories, sodium carbohydrates final. Builder final, .

, Builder , , , .

+2

Builder NutritionFacts. , NutritionFacts. ( " " ), NutritionFacts. , Builder NutritionFact, .

, thingie, Builder. NutritionFacts.Builder. , new NutritionFacts.Builder(240, 8), , , Builder serveSize 240 8. NutritionFacts , .

, , . , , : .calories(100) , Builder. , , Builder, , , - this. : Builder .

.sodium(35) .carbohydrate(27), .build() Builder. . NutritionFacts. Builder , Builder ( this). , , NutritionFacts, , Builder.

, , Builder, , , , . , :

NutritionFacts.Builder builder = new NutritionFacts.Builder(240, 8);
builder.calories(100);
builder.sodium(35);
builder.carbohydrate(27);
NutritionFacts cocaCola = builder.build();
+1

All Articles