我正在学习 get 和 set 方法,我只是想知道这些方法是否只能是公共的,是否需要为类中的每个实例变量编写它们?
8 回答
不。
许多内部变量不应该被编辑,例如计算状态。
如果一个字段是私有的并且没有 getter/setter,那么这是有原因的,只要您不需要在类外访问它,它就是可以接受的。
如果它是公共的,那就没有意义了,如果它是受保护的,它是每个包或子类,不一定在同一个包中。
没有修饰符,它是包私有的。
如果您想将字段设为私有并控制 getter/setter,您也可以使用访问级别。
关于这一点,如果需要,您可以在 setter 中执行验证,以确保只设置了可接受的值。然后,您可以静默拒绝,如果 setter 是布尔值则返回 false,或者在严重的情况下抛出异常。
我假设您在谈论封装。
这些方法的全部意义在于它们是公开的,以便它们可以将变量的值传递到应用程序的其他地方。
为了通过许多变量实现这一点,您可以考虑使用“侦听器”(观察者模式理论),它们基本上是自定义接口,可与包含许多这些 get 和 set 方法的自定义类一起使用。
更多关于封装: http://en.wikipedia.org/wiki/Encapsulation_(object-oriented_programming)
更多关于观察者模式理论 http://www.youtube.com/watch?v=UEtyGP994X0
您需要有公共的 getter 和 setter 才能让您的对象充当JavaBean。
如果您的对象没有 JavaBean 要求,那么您不需要/必须在您的类中提供公共 getter(尤其是 setter)。
基本上是,也不
是。是的, Get 和 Set 方法(也称为“getters”和“setters”或访问器方法)应该几乎总是公开的(尽管它们可以是其他方式—— can和should之间存在差异)。getter 和 setter 的目的通常是让其他类可以访问封装的实例变量。
例外:
protected
如果您只希望同一包中的子类或其他类可以访问这些方法,则可以将访问器方法设置为。- 如果您想使用特殊逻辑来设置变量(例如连接它)
并且您不希望其他类能够设置变量,则可以使用
private
(或)设置器。protected
不,他们不应该总是有访问器。有时一个变量应该只有一个 getter(例如,如果那个变量是final
),有时一个变量根本不应该被访问,因此你不会给它任何访问器方法。
Get 和 set 方法最初是为 JavaBeans 设计的,对类进行了样式化,因此 IDE 和应用程序可以检测类具有哪些属性以及它们支持哪些事件侦听器。通过称为自省的有限版本的反射,工具可以分析类,即使程序员不想使用is/get/set
方法,他也可以编写BeanInfo
类来告诉使用哪些方法。
查看 Javadoc 的java.beans.Introspector
. 和java.beans.BeanInfo
。这提供了记录附加信息的方法,包括向其他工具公开的方法和有关属性的元数据。例如,一个TemperatureGauge
类可以公开最低和最高温度,因此 Swing 程序可以设置滑块的限制,而程序员无需查找信息。
尽管如此,一个人不应该暴露超过一个必须暴露的人。您可能需要限制对 getter 和 setter 的访问。您可能需要它们作为数据库工具,但您可能不希望普通编程触及属性。这导致了诸如 OSGI 或代理之类的想法,其中方法仅限于特定的包。
例如,一种常见的策略是仅使用 getter,将变量标记为 final,并在构造函数中构建对象。例如,
public final class Complex {
private final double re;
private final double im;
public Complex(double re, double I'm) {
this.re = re;
this.im = im;
}
public double getReal() {
return re;
}
// more getters, arithmetic, etc.
}
请注意,我对方法的命名与变量略有不同;没关系。
另一方面,有一种编程风格,即避开 getter 并编写告诉对象要做什么的方法。考虑一个Name
带有实例变量givenName
的类。surname
然后,添加此方法:
public void writeFormally(Appendable app) {
app.append(surname)
.append(", ")
.append(givenName);
}
您有时会在 Model-View-Presenter 系统中看到这一点,例如 GWT 及其HasText
界面。
除非您正在编写处理依赖注入系统或使用反射使您的对象与数据库通信的代码,否则不要担心 getter 和 setter 的细节。只做自然而然的事情,并限制你的对象的曝光。此外,每次你想写:
x.getA().getB().getC().setZ(42);
重写代码以摆脱获取和设置链。在The Pragmatic Programmer中查找得墨忒耳法则。
Java 中的 Get 和 set 方法只是普通方法。它们不一定是public
,但如果不是,它们就不会很有用public
。
不需要为类中的每个实例变量编写它们。如果存在其值依赖于其他值的实例变量,那么它们具有设置器可能没有意义,例如totalPrice
依赖于实例变量的quantity
实例变量。
如果您想要不应该更改的实例变量,即它们是不可变的,那么根本不要提供任何 set 方法。
这些方法为调用者提供了接口。它们为您的对象提供您允许的操作,以便调用者无法将您的值设置为无效状态,例如 a count
of-1
或 a latitude
of 91
degree。这是“封装”,或者对调用者隐藏对象的实现。
没有将 getter 和 setter 公开的 Java 规则,但这些公开是有原因的。getter 和 setter 的要点是,只有它们用于访问它们正在获取或设置的私有变量。这样您就可以提供封装,以后重构或修改代码会容易得多。使用 getter 和 setter 函数可以实现约束和封装。可以说x是半径。shape.x = -10 没有多大意义。此外,如果有人试图设置非法值,您可以打印错误、设置默认值或什么也不做。将成员变量设为私有是一种很好的做法,这样它们就不能被使用它们的程序直接修改。
一篇关于 getter 和 setter 用法的好文章:
http://java.dzone.com/articles/getter-setter-use-or-not-use-0
如果您只希望子类访问该字段,请使用 protected。但是,如果您希望其他类访问该字段,则 public 是要走的路。您的决定应基于访问范围。