私有变量与相应的setter方法的目的是什么?

时间:2012-09-26 12:04:09

标签: java oop

当我们在java中使用私有变量的setter方法时,将变量设为私有的目的是什么?

我们有私有变量来限制用户不直接访问实例的状态。但有时,我们有相应的setter和getter方法来访问和更改私有变量的状态。如果是这样,那么我们为什么要将变量设为私有?我们可以只使用公共变量吗?

5 个答案:

答案 0 :(得分:13)

理由是你隐藏实现。当你打电话

setX(23);

您的相应变量x对客户端类隐藏,无法直接观察或修改。

为什么这样好?

  1. 它隐藏了实现。您可以在以后将x更改为(例如)stringdouble等,并且您的客户端代码不必更改。 x甚至可能会消失,调用setX()实际上会执行一些不同的但等效的功能。
  2. 通过实施setter功能,您可以强制执行验证等。否则,您无法阻止有人将x设置为无效(例如负数)值。
  3. (这是特定于Java的好处,而不是一般的OO好处)。许多Java框架使用 JavaBeans 约定来处理对象。即对于属性x,将存在相应的getX() / setX()(或isX(),如果它是boolean)。通过遵守惯例,您的类将与这些框架很好地互操作。
  4. 注意,有些参数没有setter,而是实现 immutable 对象(所以你只需要通过构造函数设置你的值)。这使得对象线程安全,并且更容易调试/推理关于对象状态。

答案 1 :(得分:1)

这不是设置者的问题,而是封装的问题:成员变量应该几乎总是私有的,以隐藏实现。

这是我最近看到的一个很好的例子:有人问为什么Java没有AtomicFloat类型,而其他人指出你可以使用AtomicInteger实际实现它并做一些技巧在intfloat之间来回转换。现在课程看起来像是:

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方法。

希望这有帮助。

谢谢, 将