这是一个非常简单的例子,直接访问可能是危险的
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
我相信你可以知道更好的方法=)
问候!
答案 0 :(得分:8)
这是你的班级,加油!你总是知道自己在做什么。如果不这样做,请编写测试。我知道你想强制使用getter而不是raw field,以防将来某个时候getter将配备一些额外的逻辑。但是因为这是你的课程,你完全有责任并且能够维护这段代码。
Bizzare匈牙利语符号只会使代码混乱。对您的班级进行单元测试,以确保没有人损害您的工作(包括您自己)。没有人会阅读文档和Javadocs,更不用说没人会理解TIASCWIAFDPUGIage
( thisIsASpecialCaseWhenIAccessFieldDirectlyPleaseUseGetterInstead_Age
),包括你在一段时间后。
顺便说一下,如果强制在类中使用封装getter,getter本身如何访问该字段?所以回到地球并且合理。拥有一套强大的单元测试更有帮助,更可靠,并提供更好的文档。
更新:实际上,有一种(种)清洁方式。您可以使用AspectJ,几个聪明的切入点,将捕获原始私有字段访问,不包括一些特殊情况。它可以在编译时执行,以使构建失败或在运行时。切入点会说:“来自未使用@ThisIsASetter
注释的方法的每个私有字段访问都应该生成编译时错误。也许有些人更熟悉AspectJ可以写这个吗?
答案 1 :(得分:2)
不,没有这样的关键字。我建议你写好文档,评论并承诺打败那些将使用直接分配价值的人
答案 2 :(得分:1)
想到的一个“技巧”是将这样的任何字段放入一个抽象类中,该类提供必要的getter / setter方法。然后,从抽象类派生你的“真实”类,现在任何对这些私有字段的写入都需要通过“安全”的setter方法来完成。
当然,这是一大笔额外开销,但它仍然无法阻止您在抽象父类中编写错误的值。
私有点是确保内部类不变量不会被使用该类的代码错误地干扰。正如你所注意的那样,它并没有阻止类本身搞乱它们,因为大概这个类知道它在做什么!如果要在依赖它们之前确保某些不变量是正确的,则始终可以使用assert
语句。如果他们开火,你可以查看你的代码,看看你做了什么导致了这个问题。
一般来说,最好的办法是小心你的代码,而不是尝试任何“技巧”。