我正在学习get和set方法,我只是想知道这些是否只能公开,是否需要为类中的每个实例变量编写?
答案 0 :(得分:4)
没有
永远不应编辑许多内部变量,例如计算状态。
如果一个字段是私有的并且没有getter / setter,那就是出于某种原因,只要你不需要在课堂外访问它就可以接受。
如果它是公开的,那就没有意义了,如果受到保护,那么每个包或子类不一定在同一个包中。
没有修饰符,它就是包私有。
如果您想将字段设为私有且控制getter / setter,您也可以使用访问级别。
在该注释中,如果需要,可以在setter中执行验证,以确保只设置可接受的值。然后,您可以静默拒绝,如果setter是布尔值则返回false,或者在严重情况下抛出异常。
答案 1 :(得分:0)
在Java中获取和设置方法只是常规方法。它们不一定是public
,但如果它们不是public
则不会非常有用。
不需要为类中的每个实例变量编写它们。如果存在其值取决于其他值的实例变量,那么它们可能没有意义使用setter,例如一个totalPrice
实例变量,它依赖于quantity
实例变量。
如果您希望实例变量不应该更改,即它们是不可变的,那么根本不提供任何设置方法。
这些方法为调用者提供了接口。它们为您允许的对象提供操作,以便调用者无法将您的值设置为无效状态,例如count
-1
或latitude
91
度。这是“封装”,或者从调用者隐藏对象的实现。
答案 2 :(得分:0)
没有java规则可以将getter和setter公之于众,但这些规则是公开的。getter和setter的意思是只有它们才能被用来访问私有变量,它们正在获取或设置。这样就可以提供封装,以后可以更容易地重构或修改代码。使用getter和setter函数可以实现约束和封装。可以说x是半径。 shape.x = -10没有多大意义。此外,如果有人试图设置非法值,您可以打印错误,设置默认值或什么都不做。优良作法是将成员变量设为私有,以便使用它们的程序不能直接修改它们。
关于getter和setter用法的好文章:
http://java.dzone.com/articles/getter-setter-use-or-not-use-0
答案 3 :(得分:0)
我假设你在谈论封装。
这些方法的重点在于它们是公开的,以便它们可以将变量的值传递给应用程序中的其他位置。
为了实现许多变量,您可以考虑使用“监听器”(Observer Pattern Theory),它们基本上是自定义接口,可以使用包含许多get和set方法的自定义类。
有关封装的更多信息: http://en.wikipedia.org/wiki/Encapsulation_(object-oriented_programming)
关于观察者模式理论的更多信息 http://www.youtube.com/watch?v=UEtyGP994X0
答案 4 :(得分:0)
您需要让对象的公共getter和setter充当JavaBean。
如果您的对象没有JavaBean要求,那么您不需要/必须在类中提供公共getter(尤其是setter)。
答案 5 :(得分:0)
基本上是,否。
是的,获取和设置方法(也称为“getters”和“setter”或访问器方法)应该几乎总是公开的(虽然它们可以否则 - 这是有区别的在可以和 之间。 getter和setter的重点通常是其他类可以访问封装的实例变量
产生的异常:
protected
同一个包中的类或其他类可以访问这些类
方法。private
(或protected
)设置器
使用特殊逻辑来设置变量(比如连接变量)
和您不希望其他类能够设置
可变点。 否,他们不应该总是有访问者。有时变量应该只有一个getter(例如,如果该变量是final
),有时根本不应该访问变量,因此你不会给它任何访问器方法。
答案 6 :(得分:0)
Get和set方法最初是为JavaBeans设计的,这些类是程式化的,因此IDE和应用程序可以检测类具有哪些属性以及它们支持哪些事件侦听器。通过称为内省的有限版本的反射,工具可以分析类,即使程序员不想使用is/get/set
方法,他也可以编写BeanInfo
类来告诉使用哪种方法。
查看java.beans.Introspector
的Javadoc。和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);
重写代码以消除gets和sets链。在实用程序员中查找 Demeter法。
答案 7 :(得分:0)
如果您只希望子类访问该字段,请使用protected。但是,如果您希望其他类访问该字段,那么公共是可行的方法。您的决定应基于访问范围。