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

Java 避免直接从同一类访问私有属性,java,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) {

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

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;
         }
      }

}
我相信你会知道更好的方法=


问候

不,没有这样的关键字。我建议你们写出好的文档、评论,并向promis推荐,以击败那个些将使用直接赋值的人。

不,并没有这样的关键字。我建议您编写好的文档、注释,并向promis发送,以击败那些将使用直接赋值的人。我想到的一个技巧是将任何类似的字段放入一个抽象类中,该类提供必要的getter/setter方法。然后,从抽象类派生出真正的类,现在对这些私有字段的任何写入都需要通过安全setter方法完成

当然,这是一个额外的开销吨,它仍然不能阻止你写不正确的值在抽象的父类无论如何

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


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

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

当然,这是一个额外的开销吨,它仍然不能阻止你写不正确的值在抽象的父类无论如何

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


一般来说,你最好的选择就是小心使用你的代码,而不是尝试任何技巧。

这是你的职业,来吧!你总是知道你在做什么。如果没有,请编写测试。我知道你想强制使用getter而不是raw字段,以防在将来的某个时候getter将配备一些额外的逻辑。但因为这是您的类,所以您完全有责任并有能力维护此代码

Bizzare匈牙利符号只会使代码混乱。单元测试你的班级,确保没有人破坏你的工作,包括你自己。没有人会阅读文档和Javadocs,更不用说没有人会理解TiascWiafdpugage。这是一个特殊的SEWHENIACCESS领域,请直接阅读文档和Javadocs,包括一段时间后的您

顺便说一句,如果您强制在类中使用封装getter,那么getter本身如何访问该字段?所以,回到现实中,讲道理吧。拥有一套强大的单元测试更有帮助、更可靠,并提供更好的文档


更新:事实上,有一种干净的方式。您可以使用AspectJ,它几乎没有聪明的切入点,可以捕获原始的私有字段访问,不包括一些特殊情况。它可以在编译时执行以使构建失败,也可以在运行时执行。切入点应该是这样的:来自未使用@ThisisSetter注释的方法的每个私有字段访问都应该生成编译时错误。也许有人能更流利地使用AspectJ写这篇文章?

这是你的课,来吧!你总是知道你在做什么。如果没有,请编写测试。我知道你想强制使用getter而不是raw字段,以防在将来的某个时候getter将配备一些额外的逻辑。但因为这是您的类,所以您完全有责任并有能力维护此代码

Bizzare匈牙利符号只会使代码混乱。单元测试你的班级,确保没有人破坏你的工作,包括你自己。没有人会阅读文档和Javadocs,更不用说没有人会理解TiascWiafdpugage。这是一个特殊的SEWHENIACCESS领域,请直接阅读文档和Javadocs,包括一段时间后的您

顺便说一句,如果您强制在类中使用封装getter,那么getter本身如何访问该字段?所以,回到现实中,讲道理吧。拥有一套强大的单元测试更有帮助、更可靠,并提供更好的文档

更新:事实上,有一种干净的方式。您可以使用AspectJ,但很少有聪明的poi
ntcuts将捕获原始的私有现场访问,不包括某些特殊情况。它可以在编译时执行以使构建失败,也可以在运行时执行。切入点应该是这样的:来自未使用@ThisisSetter注释的方法的每个私有字段访问都应该生成编译时错误。也许有人能更熟练地使用AspectJ来写这篇文章?

如果类中的每个方法都被强制通过另一个方法访问字段,那么您最终会如何更改字段值?实际上,使用可重写的setter比访问私有字段风险更大。如果有人将你的类划分为子类并重新定义二传手怎么办?@Adrian Koster,final补充道,谢谢,在这个问题中要避免的威胁是在同一个类中,就像保护它免受。。如果类中的每个方法都被强制通过另一个方法访问字段,您最终会如何更改字段值?实际上,使用可重写的setter比访问私有字段风险更大。如果有人将你的类划分为子类并重新定义二传手怎么办?@Adrian Koster,final补充道,谢谢,在这个问题中要避免的威胁是在同一个类中,就像保护它免受。。这一点应该在开发人员的大指挥中加以考虑。没有人知道别人会怎么做write@TomaszNurkiewicz你是对的,我在想一个注解@Thisissetter,它允许你访问超级私有财产,但那只是推测性的想象哈哈,我真的提出了一个问题来确认或不确认,如果确实存在类似的东西,thanks@Hern安·埃切:看我的更新。AspectJ似乎填补了您所寻找的空白。@Tomas Nurkiewicz好的,我会检查一下,我更喜欢本机Java,但也许是Java 8?谁知道呢,谢谢你这应该被考虑到在大指挥开发者。没有人知道别人会怎么做write@TomaszNurkiewicz你是对的,我在想一个注解@Thisissetter,它允许你访问超级私有财产,但那只是推测性的想象哈哈,我真的提出了一个问题来确认或不确认,如果确实存在类似的东西,thanks@Hern安·埃切:看我的更新。AspectJ似乎填补了您所寻找的空白。@Tomas Nurkiewicz好的,我会检查一下,我更喜欢本机Java,但也许是Java 8?谁知道呢,谢谢你
private int IKWIDprop;          //IKWID = I Know What I am Doing