为什么我们需要设置变量private / public?

时间:2010-04-06 09:38:41

标签: programming-languages

为什么不将所有变量设为私有?所有变量都必须给出一个getter,setter来修改/读取。为什么要在这里留下“公共”关键字?除了方便,还有其他原因吗?

7 个答案:

答案 0 :(得分:5)

嗯,他们确实有默认值。

你应该问自己的问题是,为什么不是所有公开的,一旦你理解了 - 我相信你可以回答你自己的问题。

答案 1 :(得分:1)

你是对的,最好有变量private,并拥有public getter / setter。直接访问public字段实际上是bad practice

这与所谓的“表示独立性”有关:如果通过getter / setter进行外部访问,则可以更改对象的内部表示,而不会出现重大故障。

答案 2 :(得分:1)

事实是,如果字段被迫在一种语言中私有,那么就不会丢失很多东西。在大多数语言中,如您所说,建议使用属性setter / getter封装所有字段。语言可以合理地强制所有字段都是私有的。

但是,如果您有类似私人内部类的东西:

public class OuterClass
{
     private InnerClass
     {
          public int publicField;
     }
}

然后你可能会争辩说不需要getter / setter。在这种情况下,在C#中,使用自动实现的属性同样容易。但是这些只是在C#2中引入的,所以我猜这就是公共字段仍被允许的原因。预先自动实现的属性,人们不得不编写getter / setter,这对于私有内部类来说可能被认为是过度的。

在具有指针的语言中,例如C ++,如果希望从类外获取指向字段的指针,则需要公共字段。

答案 3 :(得分:0)

将变量设为私有称为information hidingencapsulation。这些概念被引入到将程序逻辑分离到程序实现中。

变量public或变量private与public getter和setter不一样,即使getter和setter也不会对变量进行任何转换。当setget为{{1}}时,Getter和setter会对变量执行某种操作,如缓存或约束检查。

公共getter或setter可以在子类中被覆盖,专门化它的行为。你不能对公共变量做同样的事情。即使使用属性,行为也不一样,因为您无法覆盖子类中的访问者。写入(空)访问器为您提供了更多的扩展可能性。

请注意,这些概念并非由所有语言实现,例如C和Python,而不是。

答案 4 :(得分:0)

如果您是唯一使用此代码的人 - 请将其全部公开。如果不是 - 你应该使用私人领域,如果你不想让某人改变它,因为这可能会破坏你的设计,你的班级的行为将是不可预测的。

答案 5 :(得分:0)

  1. 仅内部逻辑需要一些变量
  2. 设置新值的可能验证。如果你不需要它,可能你以后会需要它

答案 6 :(得分:0)

程序员通常的反应是将类中的所有字段设置为private *,并提供由一系列getter和setter组成的接口来操作它们。这是根据封装原则,其中类的内部工作保持隐藏,并允许程序员说明可能的更改。

在某些情况下,需要public,protected和default(= none)访问说明符。 Public可以用于任何应该可以从类外部自由访问的方法或字段,而缺少说明符可以限制对类本身和同一个包内的任何类的访问。最后,当需要从子类和包中的其他类访问字段时,可以使用protected,这是框架中有时使用的方法。

这是一个显示访问说明符之间差异的链接:
http://java.sun.com/docs/books/tutorial/java/javaOO/accesscontrol.html

*除了容器对象,因为检索实例可以完全控制。