当我有一个公开的暴露类时,我通常将其成员变量与公共访问器和mutator一起设置为私有(如果可能的话,我尽量避免使用mutators使我的类不可变)。
例如,
public class Point {
private final int x;
private final int y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
public int getX() {
return x;
}
public int getY() {
return y;
}
}
如果课程是私人使用,我通常会
private static class Point {
public final int x;
public final int y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
}
我发现第二种方式对我来说更方便。虽然一个好的IDE可能会有所帮助,但不那么麻烦且打字也少。
我想知道,如果我有一个公共消费课程,我使用第二种方法是否好? (通过确保我的公开暴露字段将是不可变的)。
有任何缺点吗?虽然它似乎违反了OOP封装理论,但从实际的角度来看,我并没有看到真正的危害。
答案 0 :(得分:5)
如果它是私有类,只有父类将使用,我通常只会放入字段而不是getter和setter。如果它不被其他,第一或第三方类使用,则添加验证没有意义。
基本上,你的类需要信任自己,包括嵌套类。
但是,如果它是公共类,将由第一方或第三方使用,则绝对不应公开公共字段。如果您需要向属性添加验证,那么它将成为一个重大变化,因为您需要将公共字段更改为两个公共方法。如果您正在编写库代码,则尤其如此。
如果字段为final
,则可能是一个例外,如您的示例所示。如果它是像Point
那样的小类,并且完全不可变,那么我可能只是将这些字段公开为韵母。任何验证都将在构造函数中进行。请确保您将来不会在该类中添加任何可能会破坏该类的内容。
答案 1 :(得分:1)
通常它遵循由JavaBeans的惯例给出的存取规则是一个好主意,因为一些最常用的框架/库用它来访问内部的某些字段(例如表达式语言)。
这是完全必要的吗? 否,绝对不是,约定您可以关注它或忽略它。但是,与许多惯例一样,它的目标是采用统一的方式来做某事(这里是访问属性)。
如果您认为此类代码需要花费太多时间来开发,您可以使用IDE(正如您在问题中所述);如果问题是您必须生成的完全不必要的代码,我建议您查看Lombok Project 不幸的是,现在没有“好”的解决方案;在the premises of Java 7期间已经看到了以不同方式访问Java中的属性的想法,但最终它不会成为未来Java语言版本的一部分。
使用您的公共API,我真的建议您坚持惯例。这样,当开发人员想要使用您提供的任何组件时,他不需要包装所有内容以使用getter // setters访问属性,以使其与他正在使用的框架一起工作。
最终属性不会改变任何问题,但是,你不应该有一个最终属性,因为你担心有人可以从外面修改它,但只是因为你的属性必须永远不会改变而你想要它是最后的。这就是封装如此重要的原因。
答案 2 :(得分:0)
简单的数据持有者(也就是C中的结构)可以省去get / setters,恕我直言。一些现代的GUI工具包(如SWT或Swing)都具有简单的结构化,如Rectangle或Point,其中元素可以直接访问,并且类是公共API的一部分。哦,工具包的类上没有最终修饰符,因为通常只更改一个值(如矩形中的x,将其移动到右侧)。
一个原因是,在没有使用原始值的情况下,点和rect通常用于返回值。
所以我们可以得出一个简单的规则,其中的okey :If,并且只有当类不太可能改变时,因为它非常简单,并且如果经常使用它以便时间增益是可测量的,如果属性未在bean绑定中使用,因此当属性更改时不需要属性更改事件,那么您可以省略setter和getter。