是否有规则规定复杂的访问方法是邪恶的?

时间:2017-03-27 08:34:09

标签: java getter-setter getter access-control

添加更多功能来访问方法(getter / setter)而不仅仅是this.x = x;return x;通常被视为不良风格。

我正在寻找一份书面资料,我可以在技术论文中参考。 JavaBeans specification不包含有关访问方法内容的声明。 Java Language Specification也没有。

是否有任何正式的Oracle文档或具有高度重要性的类似内容明确指出?或者只是一部不成文的法律?

编辑:似乎我错了“通常被认为是糟糕的风格”。我不想开始讨论基于意见的主题。对我来说,我的答案是我不能认为它被认为是不好的风格。感谢您的投入!

2 个答案:

答案 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

但它没有复杂的逻辑。