【问题标题】:java - access private variables [duplicate]java - 访问私有变量
【发布时间】:2012-05-09 13:55:36
【问题描述】:

可能重复:
Java private field access

我刚刚在 java 中观察到了一些奇怪的事情(恕我直言):

class foo{
    private int secret;
    public int getSecret(){
        return secret;
    }
    public void confuseCoder(foo o){
        System.out.println(o.secret);
    }
}

有同样的问题(Java private field access possible when having a reference?),但我不确定我是否能忍受那种感觉,总有一天,我会在某个地方访问错误的变量,它会破坏世界或其他东西。

有没有办法在类级别限制对私有变量的访问?

谢谢,Vojtěch

【问题讨论】:

  • ^^ 不,这就是答案。你必须忍受你的感觉。
  • 你有“在类级别限制对私有变量的访问”我怀疑你想要的是限制对实例的访问。
  • 类级私有访问是为了让equals()、拷贝构造函数成为可能

标签: java class scope private


【解决方案1】:

有一天,我会在某个地方访问错误的变量,它会破坏世界或其他东西

这就是所谓的人性,因为java没有办法避免这个错误,编译器不会为你捕捉到它。避免破坏世界的错误的正确方法是编写测试并使用其他形式的质量管理。

虽然我认为有经验的 java 程序员可以编写注释处理器/编译器插件来将变量标记为实例私有,但目前我知道没有实现。

【讨论】:

    【解决方案2】:

    private 关键字意味着该变量不能从任何地方访问,只能从它所属的类 (http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html) 访问。这意味着您可以通过不提供 mutator 方法轻松地限制对它的访问。您也可以将其声明为final 以限制任何突变。

    【讨论】:

      【解决方案3】:

      如果您担心数据变异,您可以随时使用final。它甚至可以公开:

      class Foo{
          public final int secret;
          public int getSecret(){
              return secret;
          }
          public Foo(int s){
             secret=s;
          }
      
         public static void main (String args[])
        { 
          foo Foo=new Foo(1);
          foo.secret=2;//Illegal 
         }
      } 
      

      【讨论】:

      • 虽然我同意你的说法,但 OP 的问题是关于 access 而不是突变。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-25
      • 2018-11-02
      • 1970-01-01
      • 2018-10-28
      相关资源
      最近更新 更多