我有一个对象,其中构造函数的工作是设置字段,并且在此之后不会设置或更改它们。但是,我需要一个吸气剂。然后,我是否需要设置器,即使我永远不会使用它们“以防万一”,或者我可以删除它们并只留下 getter,同时将值设置给构造函数?
6 回答
根据java bean 规范,省略 getter 或 setter 方法是合法的。所以,如果你从不使用 setter,你可以放心地忽略它们
如果您的构造函数正在设置字段并且您不需要更改它们,它们听起来像是不可变的。
我会让它们成为最终的,然后只有吸气剂。
如果您省略了决赛,那么您允许将来有人添加二传手。如果您不需要 setter,那么您应该将其作为设计的一部分强制执行,并使用带有最终字段的 gettets。
这将使任何阅读代码的人清楚地知道它们在设计上是不可变的。
还有一个问题是编写比我们需要的更多的代码。如果您编写 setter,那么您可能会引入错误,因为此代码可能未经过全面测试,因为您认为不需要它
如果您想将对象属性用作只读并在对象的构造函数中对其进行初始化,那么您不需要设置器。如果你想在这个类之外访问这个属性,那么你需要 getter。
还建议您阅读此SO Question
以下来自谷歌的建筑师:
class Foo{
private int a;
private int b;
public Foo(int num1, int num2){
a= num1;
b= num2;
}
public int getA(){
return a;
}
public int getB(){
return b;
}
}
在这里你不需要设置器,一旦你构造了你的对象。你不能改变它的状态。
对于只有您会看到的内容,这完全是个人选择,因为大多数编辑器都可以为您自动添加它们。
如果它是永远不应该改变的东西并且如果它改变了可能会发生坏事,那么它不应该有一个设置器并且应该是一个私有变量。
如果你写的东西着眼于重用和与他人共享,那么你确实需要 getter 和 setter 任何可以这样做的地方,因为你不知道其他人可能需要对你的 API 做什么。
我认为这取决于您的构造函数在做什么。如果您的构造函数只是对变量进行原始设置,那么我认为您不需要为它们包含设置器。
但是,如果您的构造函数代码在设置变量的值之前执行任何类型的业务逻辑,那么我认为这保证至少为所讨论的变量(如果不是全部)创建一个设置器。
例如,如果您的构造函数代码执行此操作,则不要包含任何设置器:
public MyClass( String varA, String varB, int varC )
{
this.varA = varA;
this.varB = varB;
this.varC = varC;
}
但是,如果您的代码这样做,您应该包含一个 setter 来解耦逻辑并使其更清晰:
public MyClass( String varA, String varB, int varC )
{
if ( varA == null )
{
this.varA = '(empty)';
}
else
{
this.varA = varA;
}
this.varB = varB;
if ( varC < 0 )
{
callSomeMethod();
}
this.varC = varC;
}
这种逻辑值得创建二传手。