何时将实例变量设为私有?

时间:2012-10-21 09:38:03

标签: java oop

我正在尝试理解类中getter / setter方法的用法。假设我们有一个名为A的类,其中包含一些 public 实例变量,后跟一个带参数的构造函数,其中参数从另一个类(main)传递给它。在构造函数中,我们让那些实例变量等于传递的内容。

现在如果这个类被另一个程序员使用,没有什么能阻止他们直接访问/更改实例变量到无效的东西。通过将实例变量设为私有,我们可以消除对这些变量的访问。但是,如果我们想要间接地或在某些特定条件下更新/更改这些实例变量,或者只是让该人可以访问实例变量,我们将为此创建一个getter / setter对。

好处?:
1.仅在set()方法下的某些有效原因下更改实例变量
2.因此,我们可以显示实例变量的实际内容,而不会让正在使用此类的程序员更改它。

这是正确的解释吗?

4 个答案:

答案 0 :(得分:7)

封装 - 指将所有相关成员(变量和方法)保存在一个对象中。指定 作为私有的成员变量可以隐藏变量和方法。物体应该隐藏它们的内部运作 外面的观点。 良好的封装可以防止对象相互交互,从而提高代码模块性 一种意想不到的方式,这反过来又使未来的开发和重构工作变得容易。

enter image description here

能够封装类的成员对于安全性完整性非常重要。我们可以保护变量 不可接受的价值观。上面的示例代码描述了如何使用封装来保护 MyMarks 对象 从负值。对成员变量 vmarks 的任何修改只能通过setter执行 方法setMarks(int mark)。这可以防止对象 MyMarks 通过抛出一个负值 异常。

答案 1 :(得分:1)

您的解释是正确的。另外(在我的头顶):

  • 它允许更改类的实现(例如,如果您希望删除该字段并替换它),而不会强迫消费者以任何不同的方式与您的类进行交互。
  • 它允许AOP框架拦截对get / set方法的调用。
  • 您可以通过注释指定权限以访问方法。

答案 2 :(得分:0)

是的,您的解释是正确的。 但这是因为语言的限制。例如,在python中,您不需要每次都使用getter或setter进行编写,因为您可以覆盖成员变量的行为。例如:

class MyClass:
    def __init__(self, myproperty):
        self.myproperty = myproperty

如果每个人都像以下那样使用它:

print(new MyClass("test").myproperty)

你仍然可以改变你吸气的行为:

class MyClass:
    def __init__(self, myproperty):
        self._myproperty = myproperty

    @property
    def myproperty(self):
        return self._myproperty + " changed behavior"

甚至是没有触摸代码的setter你上课的用途:

   @myproperty.setter
   def myproperty(self, myproperty):
       if len(myporperty) > 0:
            self._myproperty = myproperty

有关更好的示例,请参阅property参考。

答案 3 :(得分:0)

如果实例变量仅由其类中使用定义的方法使用,则应将其设为私有;如果实例变量必须在特定范围内,则应为私有且仅可通过访问器使用methods [getter以及Setter]方法。