当我们在java中有私有变量的setter方法时,将变量设为私有的目的是什么?
我们有私有变量来限制用户不能直接访问实例的状态。但有时,我们有相应的 setter 和 getter 方法来访问和更改私有变量的状态。如果是这样,那我们为什么要将变量设为私有?我们可以只使用公共变量,对吗?
理由是你隐藏了实现。你打电话时
setX(23);
您对应的变量x
对客户端类是隐藏的,不能直接观察或修改。
为什么这样好?
x
在以后更改为(例如) a string
, adouble
等,并且您的客户端代码不必更改。x
甚至可能消失,调用setX()
实际上会执行一些不同但等效的功能。x
为无效(例如负)值。x
,将存在一个相应的getX()
/ setX()
(或者isX()
如果它是一个boolean
)。通过遵守约定,您的类将与这些框架很好地互操作。请注意,没有设置器而是实现不可变对象的参数(因此您可以仅通过构造函数设置值)。这使得对象线程安全和调试/推理对象状态更容易。
这不是有没有设置器的问题,而是封装的问题:成员变量几乎应该总是私有的,以便隐藏实现。
这是我最近看到的一个很好的例子:有人问为什么 Java 没有AtomicFloat
类型,而其他人指出你实际上可以使用和做一些技巧来实现它,在andAtomicInteger
之间来回转换。现在这个类看起来像:int
float
class AtomicFloat {
private AtomicInteger value;
public float get() {
// turn value into float
}
public void set(float newValue) {
// turn newValue into int
}
// CAS and whatever else
}
现在在外面看来我已经拥有了我所需要的一切:我可以将这个类用作一个AtomicFloat
并且我不关心里面发生了什么。现在想象一下,如果用户可以窥视并看到我所有的方法实际上都在用AtomicInteger
. 那真的会把事情搞砸!
阻止调用者做一些愚蠢的事情。想象一个 Date 类(一个简单的类,不是 Java 或 Jodatime 的 Date 类),它在 int 字段中存储月份中的日期、月份本身和年份本身:
public int dayOfMonth;
public int monthOfYear;
public int year;
这样,没有什么可以阻止调用者在一年中的第 56 个月的第 234 天创建此 Date 类的实例。
另一方面,如果您对私有字段使用 setter 方法,则这些 setter 方法可以检查传递的值是否合理(例如,setMonth()
不使用 1 到 12 范围之外的值调用它等)
setter
是 mutator 方法 & 一个 mutator 方法是一种用于control changes to a variable
.
但是来自其他类的private
修饰符
可以简单地通过定义一个setter而不是私有修饰符来制作参数controls the accessiability of a variable
write-only
这种方法通常在以下情况下使用:
Class Car {
Private int wheels
Private int tyres
Private time lastUpdated
- setWheels(int i) {
lastUpdated = Time.Now
wheels = i
tyres = i
}
- setTyres(int i) {
lastUpdated = Time.Now
tyres = i
wheels = i
}
}
假设当该变量更新时,您还想做一些依赖它的其他事情。
这是一个简单的例子,所以轮子的数量与轮胎的数量直接相关,所以我们可以设置,当你使用setter方法时,我们也想知道汽车最后一次更新的时间,基本上它可以让你执行其他任务取决于变量的变化。
将变量设为私有的原因是,在从类外部访问变量时必须使用 setter 方法。
希望这可以帮助。
谢谢,威尔