Java 使用默认值对构造函数进行最佳处理

Java 使用默认值对构造函数进行最佳处理,java,constructor,overloading,Java,Constructor,Overloading,我有一个包含多个属性的类,所有属性都具有默认值。属性不是可选的,它们是必需的,但具有默认值。例如: String fillColor = "White"; String borderColor = "Blue"; int size = 10; 使用单个构造函数并在需要默认值时传入空值是否是一种不好的做法 Object myObject = new Object(null, null, 15); 或者,我正在考虑可能实现一个构建器 使用单个构造函数并在需

我有一个包含多个属性的类,所有属性都具有默认值。属性不是可选的,它们是必需的,但具有默认值。例如:

String fillColor = "White";
String borderColor = "Blue";
int size = 10;
使用单个构造函数并在需要默认值时传入空值是否是一种不好的做法

Object myObject = new Object(null, null, 15);
或者,我正在考虑可能实现一个构建器

使用单个构造函数并在需要默认值时传入空值是否是一种不好的做法

Object myObject = new Object(null, null, 15);
对。您假设阅读代码的人会知道“null表示默认值”,而不是他们实际上希望值为null

添加一个重载,您可以调用该重载,而无需使用无意义的文本null:

Object myObject = new Object(15);
它调用另一个构造函数:

Object(int size) {
  this("White", "Blue", size);
}
或静态工厂方法(具有有效Java项目1中提到的“命名构造函数”优势,允许自记录int参数的含义):

使用单个构造函数并在需要默认值时传入空值是否是一种不好的做法

Object myObject = new Object(null, null, 15);
对。您假设阅读代码的人会知道“null表示默认值”,而不是他们实际上希望值为null

添加一个重载,您可以调用该重载,而无需使用无意义的文本null:

Object myObject = new Object(15);
它调用另一个构造函数:

Object(int size) {
  this("White", "Blue", size);
}
或静态工厂方法(具有有效Java项目1中提到的“命名构造函数”优势,允许自记录int参数的含义):

这是一个判断

想象一下,有人在读代码,但他对你的类不太了解。他们能理解这两个
null
s是什么意思吗?他们可能需要查找构造函数,看看这些参数是什么。即使是熟悉的用户也可能很难记住是填充还是边框颜色排在第一位

这些都是拥有更多构造函数,甚至使用构建器类的好理由。其他构造函数允许完全忽略未使用的参数

Object(int size);
Object(String fillColor, String borderColor);
Object(String fillColor, String borderColor, int size);
缺点是,对于省略的参数的每个组合,都必须有不同的构造函数。如果有很多组合,它可能会变得笨拙。在最坏的情况下,对于n个参数,您可能必须提供2n个构造函数

如果用户想要设置一种颜色而不是另一种颜色,这也没有帮助

Object(String fillColor);     // ambiguous overloads
Object(String borderColor);
生成器提供了最大的灵活性。设置彼此独立设置,避免前面描述的指数放大。相同类型的设置不再具有歧义性。填充颜色和边框颜色都是字符串不是问题:

class ObjectBuilder {
    ObjectBuilder fillColor(String fillColor);
    ObjectBuilder borderColor(String borderColor);
    Objectbuilder size(int size);
    Object build();
}
折衷是增加代码复杂性。构建器类需要创建大量的工作。它还使构造更加冗长,可能是正面的,也可能是负面的。运用你最好的判断力。

这是一个判断电话

想象一下,有人在读代码,但他对你的类不太了解。他们能理解这两个
null
s是什么意思吗?他们可能需要查找构造函数,看看这些参数是什么。即使是熟悉的用户也可能很难记住是填充还是边框颜色排在第一位

这些都是拥有更多构造函数,甚至使用构建器类的好理由。其他构造函数允许完全忽略未使用的参数

Object(int size);
Object(String fillColor, String borderColor);
Object(String fillColor, String borderColor, int size);
缺点是,对于省略的参数的每个组合,都必须有不同的构造函数。如果有很多组合,它可能会变得笨拙。在最坏的情况下,对于n个参数,您可能必须提供2n个构造函数

如果用户想要设置一种颜色而不是另一种颜色,这也没有帮助

Object(String fillColor);     // ambiguous overloads
Object(String borderColor);
生成器提供了最大的灵活性。设置彼此独立设置,避免前面描述的指数放大。相同类型的设置不再具有歧义性。填充颜色和边框颜色都是字符串不是问题:

class ObjectBuilder {
    ObjectBuilder fillColor(String fillColor);
    ObjectBuilder borderColor(String borderColor);
    Objectbuilder size(int size);
    Object build();
}

折衷是增加代码复杂性。构建器类需要创建大量的工作。它还使构造更加冗长,可能是正面的,也可能是负面的。使用您的最佳判断。

如果“默认值”不依赖于使用的构造函数或提供的值之一,那么我将初始化成员变量,而不是要求调用
此(…)
。例如,只需
this.size=size
。默认值应该在一个位置,而不是分散在其他构造函数
this()
调用中。@JimGarrison对每个构造函数都有自己的调用。我习惯于编写有“一个真构造函数”的类,而其他所有类都只是调用
this(…)
的方便重载。在这种情况下,假设有5个不同的构造函数都调用“1个真构造函数”,那么您必须跟踪所有5个
this()
调用中的默认值。当默认值更改时,是否要在5个位置查找它?@JimGarrison,为什么
this.foo=“defaultFoo”;this.bar=“defaultBar”
这个(“defaultFoo”、“defaultBar”)更擅长不分散默认值?您仍然拥有该ctor中的默认值。也许我误解了您的意思。@JimGarrison在静态成员中定义默认值?如果“默认值”不依赖于使用的构造函数或提供的值之一,那么我将初始化成员变量,而不是要求调用
此(…)
。例如,只需
this.size=size
。默认值应该在一个位置,而不是分散在其他构造函数
this()
调用中。@JimGarrison对每个构造函数都有自己的调用。我习惯于编写有“一个真正的构造函数”的类,而其他所有的类都只是调用
this(…)
的方便重载。在这种情况下,假设有5个不同的构造函数都调用“1个真正的构造函数”,