避免直接从同一个类访问私有属性

时间:2011-07-04 18:39:21

标签: java

这是一个非常简单的例子,直接访问可能是危险的

class Something{

      public static final int MAX=123;

      private int prop;     

      final void riskyMethod()
      {
          this.prop=800; //this is wrong
      }    

      final void safeSetProp(int x)
      {
         if(x<MAX) 
         {
            prop=x;
         }
      }

}

我知道可以在另一个类中封装“prop”, 并将其定义为私有,但这是很多无用的代码开销!

有没有办法强制使用方法来访问相同的类属性?

关键字?任何诡计?

我承认我做过这样的事情是为了避免同一个班级意外访问

private int IKWIDprop;          //IKWID = I Know What I am Doing

我相信你可以知道更好的方法=)

问候!

3 个答案:

答案 0 :(得分:8)

这是你的班级,加油!你总是知道自己在做什么。如果不这样做,请编写测试。我知道你想强制使用getter而不是raw field,以防将来某个时候getter将配备一些额外的逻辑。但是因为这是你的课程,你完全有责任并且能够维护这段代码。

Bizzare匈牙利语符号只会使代码混乱。对您的班级进行单元测试,以确保没有人损害您的工作(包括您自己)。没有人会阅读文档和Javadocs,更不用说没人会理解TIASCWIAFDPUGIage thisIsASpecialCaseWhenIAccessFieldDirectlyPleaseUseGetterInstead_Age ),包括你在一段时间后。

顺便说一下,如果强制在类中使用封装getter,getter本身如何访问该字段?所以回到地球并且合理。拥有一套强大的单元测试更有帮助,更可靠,并提供更好的文档

更新:实际上,有一种()清洁方式。您可以使用AspectJ,几个聪明的切入点,将捕获原始私有字段访问,不包括一些特殊情况。它可以在编译时执行,以使构建失败或在运行时。切入点会说:“来自未使用@ThisIsASetter注释的方法的每个私有字段访问都应该生成编译时错误。也许有些人更熟悉AspectJ可以写这个吗?

答案 1 :(得分:2)

不,没有这样的关键字。我建议你写好文档,评论并承诺打败那些将使用直接分配价值的人

答案 2 :(得分:1)

想到的一个“技巧”是将这样的任何字段放入一个抽象类中,该类提供必要的getter / setter方法。然后,从抽象类派生你的“真实”类,现在任何对这些私有字段的写入都需要通过“安全”的setter方法来完成。

当然,这是一大笔额外开销,但它仍然无法阻止您在抽象父类中编写错误的值。

私有点是确保内部类不变量不会被使用该类的代码错误地干扰。正如你所注意的那样,它并没有阻止类本身搞乱它们,因为大概这个类知道它在做什么!如果要在依赖它们之前确保某些不变量是正确的,则始终可以使用assert语句。如果他们开火,你可以查看你的代码,看看你做了什么导致了这个问题。

一般来说,最好的办法是小心你的代码,而不是尝试任何“技巧”。