当我们在java中使用私有变量的setter方法时,将变量设为私有的目的是什么?
我们有私有变量来限制用户不直接访问实例的状态。但有时,我们有相应的setter和getter方法来访问和更改私有变量的状态。如果是这样,那么我们为什么要将变量设为私有?我们可以只使用公共变量吗?
答案 0 :(得分:13)
理由是你隐藏实现。当你打电话
setX(23);
您的相应变量x
对客户端类隐藏,无法直接观察或修改。
为什么这样好?
x
更改为(例如)string
,double
等,并且您的客户端代码不必更改。 x
甚至可能会消失,调用setX()
实际上会执行一些不同的但等效的功能。x
设置为无效(例如负数)值。x
,将存在相应的getX()
/ setX()
(或isX()
,如果它是boolean
)。通过遵守惯例,您的类将与这些框架很好地互操作。注意,有些参数没有setter,而是实现 immutable 对象(所以你只需要通过构造函数设置你的值)。这使得对象线程安全,并且更容易调试/推理关于对象状态。
答案 1 :(得分:1)
这不是设置者的问题,而是封装的问题:成员变量应该几乎总是私有的,以隐藏实现。
这是我最近看到的一个很好的例子:有人问为什么Java没有AtomicFloat
类型,而其他人指出你可以使用AtomicInteger
实际实现它并做一些技巧在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
进行舞台魔术。这真的搞砸了!
答案 2 :(得分:0)
阻止调用者做一些愚蠢的事情。想象一下Date类(一个简单的类,不是Java和Jodatime的Date类),它将月中的日期,月份本身和年份本身存储在int字段中:
public int dayOfMonth;
public int monthOfYear;
public int year;
有了这个,没有什么可以阻止调用者在一年的第56个月的第234天创建这个Date类的实例。
另一方面,如果对私有字段使用setter方法,那些setter方法可以检查传递的值是否合理(例如,{1}}未调用超出1到12范围的值等)
答案 3 :(得分:0)
setter
是mutator方法& mutator方法是用于control changes to a variable
的方法
但来自其他班级的private
修饰符controls the accessiability of a variable
只需通过定义一个setter而不是private修饰符
write-only
参数
答案 4 :(得分:0)
这种方法通常用于例如:
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方法。
希望这有帮助。
谢谢, 将