【发布时间】:2018-10-30 17:54:39
【问题描述】:
我正在尝试在 C# 中重新创建我在“Efective Java”一书中找到的优雅的构建器模式,但我不是 C# 专家。
// Builder Pattern
public class NutritionFacts {
private final int calories;
private final int fat;
private final int sodium;
private final int carbohydrate;
public static class Builder {
// Optional parameters - initialized to default values
private int calories = 0;
private int fat = 0;
private int carbohydrate = 0;
private int sodium = 0;
public Builder();
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) {
calories = builder.calories;
fat = builder.fat;
sodium = builder.sodium;
carbohydrate = builder.carbohydrate;
}
}
有了这个Builder,你可以像这样创建NutritionFacts对象,一一提供构造函数参数:
NutritionFacts cocaCola = new NutritionFacts.Builder(). calories(100).sodium(35).carbohydrate(27).build();
但是,在 C# 中,静态嵌套类中似乎不允许使用非静态参数。那么,我怎么能把它翻译成 C# 呢?
提前致谢。
【问题讨论】:
-
“非静态参数”是什么意思? “静态”一词仅适用于类成员,不适用于函数参数,所以我不清楚您指的是什么。
-
另外,您应该尝试将 Java 代码翻译成 C#。如果您在此过程中遇到问题,您可以在代码中发布问题并描述问题,包括任何错误。
-
我认为诀窍是不要让
Builder是静态的。不确定 Java 中的什么黑魔法可以让您实例化静态类。 -
@juharr 在 Java 中,静态类与该类的成员是实例还是静态无关,而是与嵌套类是否具有对包含类的隐式引用有关。
-
这种风格在 C# 中不是很惯用。但是,正如您所发现的,C# 中的
static类只能有静态成员。它不能被实例化。相反,您希望它拥有的是一个非静态类(您正在实例化一个并设置实例状态)。如果您从class Builder中删除static,它似乎应该可以工作。顺便说一句,C# 程序员会期望类的公共方法(通过构建的卡路里)将被大写 - 作为特定语言风格的问题。