java - 在 Java 中调用多个方法

标签 java class methods method-chaining

我发现了一种在 Java 中调用多个方法的新方法,但我不太明白背后发生了什么:

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;
    }

}

现在这个类是使用这一行实例化的,这里是它变得困惑的地方:

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

在 NutritionFacts.Build(int, int) 之前一切都有意义,在那之后,到底发生了什么?为什么 Builder 类的 caloriessodiumcarbohydrate 方法需要返回 this?该类地址进入何处?

谢谢!

最佳答案

它不会“进入”任何东西。

这些方法返回一个值。在这种情况下,它们返回当前实例 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

Here's an SO question with some good examples.

关于java - 在 Java 中调用多个方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7910124/

相关文章:

java - 在挑战中结合 c = c & (1 << bit) 和 int c = passkey.charAt(i % passkey.length()

python - 如何在 python 中迭代/操作类对象列表(分散网络模拟中的节点爬行)

objective-c - 下面的类函数试图实现什么目的?

Java - 从另一个类调用方法[错误]

javascript - wrapMethod Meteor 方法

Java IO file length() 和 lastModified() 在处理数百万个文件时执行缓慢

java - @OneToMany 关联的标准

java - javax.swing.JFrame不包含setDefaultCLoseOperation

c++ - 没有匹配的函数来调用 class::class

iphone - 从其他两个函数调用相同的函数