添加更多功能来访问方法(getter / setter)而不仅仅是this.x = x;
或return x;
通常被视为不良风格。
我正在寻找一份书面资料,我可以在技术论文中参考。 JavaBeans specification不包含有关访问方法内容的声明。 Java Language Specification也没有。
是否有任何正式的Oracle文档或具有高度重要性的类似内容明确指出?或者只是一部不成文的法律?
编辑:似乎我错了“通常被认为是糟糕的风格”。我不想开始讨论基于意见的主题。对我来说,我的答案是我不能认为它被认为是不好的风格。感谢您的投入!
答案 0 :(得分:3)
这本质上是一种自以为是的观点,但我的印象却相反。如果确实将getter / setter限制为简单的返回/赋值,那么它们将不会提供直接逼近的附加值。
对于setter进行一些验证是非常普遍和期望的。
此外,可以为计算字段(如getSum(),getAvg()等)创建getter方法,在这种情况下,它们可能包含简单或复杂的计算。
答案 1 :(得分:1)
正如@SharonBenAsher所写的那样,这个话题是基于意见的,我支持相反的意见。
恕我直言,这是两种基本类型:数据传输对象(DTO / Beans)等。默认情况下,只有DTO应该具有getter(并且不常使用)setter。 "其他"只有当你有充分的理由需要违反信息隐藏原则时,类才应该有getter。
但他们为什么要有(复杂的)逻辑呢?
我的理由是:它违反了单一责任模式。 DTO的责任是携带数据。验证数据一致性或对它们进行一些计算的责任属于使用/填充DTO的代码。
为什么要有吸气剂/二传手?为什么不直接访问?使DTO像C结构 - Sharon Ben Asher
由于信息隐藏原则。
仅仅因为你有一个DTO并不意味着你必须将值存储在一些不同的成员变量中,它可能是一个集合。
DTO也可以包含其他DTO:
class Circle{
private Point center;
private double radius;
Circle(double x, double y, double r){
center = new Point(x,y);
radius=r;
}
getX(){return center.getX();}
getY(){return center.getY();}
getRadius(){return radius;}
}
直接访问属性时,您必须知道和以后无法更改它...
我没有看到验证其状态的类如何违反单一责任模式。它可以调用实用程序或某个外部类来帮助验证过程, - Sharon Ben Asher
更糟糕的是。实用程序类是隐藏依赖项,您可以将其添加到将DTO传递到的下一层。只要这个"下一层"这可能不是问题。正在使用相同的JVM,但如果这是在网络连接的另一端呢?
我是吗?但是不能说这项任务绝对不负责任。 - Sharon Ben Asher
我自己认为我的理由足够重,可以按照我的方式去做。如果你不同意,对我来说没问题。
这取决于设计和具体情况。与创作相同。有时您将责任委托给工厂方法,有时您会直接调用构造函数。 - Sharon Ben Asher
但是如果情况发生变化(通常在应用程序开发时会发生变化)怎么办?我从数据结构中单独验证的方法总是工作。
我认为你的示例代码是非简单getter的一个很好的例子...... - Sharon Ben Asher
但它没有复杂的逻辑。