为什么 Java 中的属性可以是公开的?

2022-09-01 00:42:27

众所周知,Java遵循面向对象的范式,其中数据封装说,对象的字段(属性)应该隐藏外部世界,并且只能通过方法访问,或者方法是外部世界类的唯一接口。那么,为什么可以在Java中将字段声明为公共字段,这将违反数据封装范式呢?


答案 1

我认为这是可能的,因为每个规则都有其例外,在某些情况下,每个最佳实践都可以被覆盖。

例如,我经常将公共静态最终数据成员公开为公共(例如,常量)。我不认为这是有害的。

我要指出的是,这种情况在Java以外的其他语言中也是如此:C++,C#等。

语言不需要总是保护我们免受自己的伤害。

在Oli的例子中,如果我这样写有什么害处?

public class Point {
   public final int x;
   public final int y;

   public Point(int p, int q) {
      this.x = p;
      this.y = q;
   } 
}

它是不可变的,线程安全的。数据成员可能是公开的,但您不能伤害它们。

此外,这是一个肮脏的小秘密,“私有”在Java中并不是真正的私有。你总是可以使用反射来绕过它。

所以放松一下。这还不错。


答案 2

为了灵活性。如果我不能写,那将是一个巨大的痛苦:

class Point {
    public int x;
    public int y;
}

将这一点隐藏在拦手和二传手后面几乎没有什么好处。