7

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

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

4

5 回答 5

14

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

setX(23);

您对应的变量x对客户端类是隐藏的,不能直接观察或修改。

为什么这样好?

  1. 它隐藏了实现。您可以x在以后更改为(例如) a string, adouble等,并且您的客户端代码不必更改。x甚至可能消失,调用setX()实际上会执行一些不同但等效的功能。
  2. 通过实现 setter 函数,您可以强制执行验证等。否则,您无法阻止某人设置x为无效(例如负)值。
  3. (这是 Java 特有的好处,而不是一般的 OO 好处)。许多 Java 框架使用JavaBeans约定来处理对象。即对于一个属性x,将存在一个相应的getX()/ setX()(或者isX()如果它是一个boolean)。通过遵守约定,您的类将与这些框架很好地互操作。

请注意,没有设置器而是实现不可变对象的参数(因此您可以仅通过构造函数设置值)。这使得对象线程安全和调试/推理对象状态更容易。

于 2012-09-26T12:05:55.937 回答
1

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

这是我最近看到的一个很好的例子:有人问为什么 Java 没有AtomicFloat类型,而其他人指出你实际上可以使用和做一些技巧来实现它,在andAtomicInteger之间来回转换。现在这个类看起来像: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. 那真的会把事情搞砸!

于 2012-09-26T12:08:09.420 回答
0

阻止调用者做一些愚蠢的事情。想象一个 Date 类(一个简单的类,不是 Java 或 Jodatime 的 Date 类),它在 int 字段中存储月份中的日期、月份本身和年份本身:

public int dayOfMonth;
public int monthOfYear;
public int year;

这样,没有什么可以阻止调用者在一年中的第 56 个月的第 234 天创建此 Date 类的实例。

另一方面,如果您对私有字段使用 setter 方法,则这些 setter 方法可以检查传递的值是否合理(例如,setMonth()不使用 1 到 12 范围之外的值调用它等)

于 2012-09-26T12:10:41.893 回答
0

setter是 mutator 方法 & 一个 mutator 方法是一种用于control changes to a variable.
但是来自其他类的private修饰符 可以简单地通过定义一个setter而不是私有修饰符来制作参数controls the accessiability of a variable
write-only

于 2012-09-26T12:12:05.657 回答
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 方法。

希望这可以帮助。

谢谢,威尔

于 2012-09-26T12:12:20.227 回答