Java 有没有规定复杂的访问方法是邪恶的?

Java 有没有规定复杂的访问方法是邪恶的?,java,getter-setter,getter,access-control,Java,Getter Setter,Getter,Access Control,向访问方法(getter/setter)添加更多功能,而不仅仅是this.x=x或返回x通常被认为是不好的样式 我正在寻找一个书面来源,我可以在技术论文参考。不包含有关访问方法内容的语句。政府也没有 是否有任何甲骨文官方文件或类似的具有重要意义的文件明确指出:?还是仅仅是一条不成文的法律 编辑:似乎我对“通常被认为是糟糕的风格”的看法是错误的。我不想开始讨论一个基于观点的话题。对我来说,我的答案是,我不能认为这是一种糟糕的风格。谢谢你的意见 这本质上是一种固执己见的观点,但我的印象正好相反。如果

向访问方法(getter/setter)添加更多功能,而不仅仅是
this.x=x
返回x通常被认为是不好的样式

我正在寻找一个书面来源,我可以在技术论文参考。不包含有关访问方法内容的语句。政府也没有

是否有任何甲骨文官方文件或类似的具有重要意义的文件明确指出:?还是仅仅是一条不成文的法律


编辑:似乎我对“通常被认为是糟糕的风格”的看法是错误的。我不想开始讨论一个基于观点的话题。对我来说,我的答案是,我不能认为这是一种糟糕的风格。谢谢你的意见

这本质上是一种固执己见的观点,但我的印象正好相反。如果getter/setter确实仅限于简单的返回/分配,那么它们将不会提供任何附加值,而不是直接方法

这是很常见的,期望setter进行一些验证


此外,可以为计算字段(如getSum()、getAvg()等)创建getter方法,在这种情况下,它们可能包括简单或复杂的计算

这本质上是一种固执己见的观点,但我的印象正好相反。如果getter/setter确实仅限于简单的返回/分配,那么它们将不会提供任何附加值,而不是直接方法

这是很常见的,期望setter进行一些验证


此外,可以为计算字段(如getSum()、getAvg()等)创建getter方法,在这种情况下,它们可能包括简单或复杂的计算

正如@SharonBenAsher所写的,这个话题是基于观点的,我的观点正好相反

IMHO有两种基本类型的类:数据传输对象(DTO/Beans)和其他。默认情况下,只有DTO才应该有getter(而且很少有)setter。只有当您有充分的理由需要违反信息隐藏原则时,“其他”类才应该有getter

但是为什么他们不应该有(复杂的)逻辑呢

我的理由是:它违反了单一责任模式。DTO的职责是传输数据。验证数据一致性或对其进行某些计算的责任属于使用/填充DTO的代码


那么,为什么要选择getter/setter呢?为什么不直接访问?将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;}
}
当直接访问属性时,您必须意识到这一点,并且以后无法更改它


我看不出验证其状态的类是如何违反单一责任模式的。它可能会调用一个实用程序或一些外部类来帮助验证过程

更糟糕的是。实用程序类是一个隐藏的依赖项,您可以将其添加到下一层,在该层中您可以将DTO交付到该层。只要这个“下一层”使用同一个JVM,这可能不是问题,但是如果它位于网络连接的另一端呢

但我们不能说它对这项任务毫无反应莎伦·本·阿舍

是吗

就我自己而言,我有足够的理由按我的方式去做。如果你不同意,我也可以

这取决于设计和具体情况。创造也是如此。有时您将责任委托给工厂方法,有时您将直接调用构造函数莎伦·本·阿舍

但如果情况发生变化(应用程序开发时通常会发生这种情况),该怎么办?我将验证与数据结构分离的方法将始终有效


我认为您的示例代码是一个很好的非简单getter示例…——莎伦·本·阿舍


但是它没有复杂的逻辑。

正如@SharonBenAsher所写的,这个话题是基于观点的,我支持相反的观点

IMHO有两种基本类型的类:数据传输对象(DTO/Beans)和其他。默认情况下,只有DTO才应该有getter(而且很少有)setter。只有当您有充分的理由需要违反信息隐藏原则时,“其他”类才应该有getter

但是为什么他们不应该有(复杂的)逻辑呢

我的理由是:它违反了单一责任模式。DTO的职责是传输数据。验证数据一致性或对其进行某些计算的责任属于使用/填充DTO的代码


那么,为什么要选择getter/setter呢?为什么不直接访问?将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;}
}
当直接访问属性时,您必须意识到这一点,并且以后无法更改它


我看不出验证其状态的类是如何违反单一责任模式的。它可能会调用一个实用程序或一些外部类来帮助验证过程

更糟糕的是。实用程序类是一个隐藏的依赖项,您可以将其添加到下一层,在该层中您可以将DTO交付到该层。只要这个“下一层”使用同一个JVM,这可能不是问题,但是如果它位于网络连接的另一端呢

但我们不能说它对这项任务毫无反应莎伦·本·阿舍

是吗

就我自己而言,我有足够的理由按我的方式去做。如果你不同意,我也可以

这取决于