1

我想确保某个包中所有类的 getter 都遵循给定的模板。

例如,所有 getter 必须采用以下形式:

XXX getYYY(){
    classLock.lock(); 
    return YYY;
    finally{
        classLock.unlock(); 
    }
}

基本上,我希望我的项目不会编译/运行,除非所有吸气剂都是这种形式。

最好的方法是什么?我更喜欢可以用作 Eclipse 插件的解决方案。

4

4 回答 4

6

为什么不使用AspectJ(或其他一些面向方面的框架)在编译阶段自动包装你的 getter?您可以简单地指定要包装的方法的类型(例如,在一组特定的类中)并指定代码以提供前/后执行。

于 2010-04-12T14:26:01.830 回答
5

没有办法强制编译器进行检查。您可能想研究静态代码分析工具,例如PMDCheckStyle,并为此定义自己的规则。

然后在您的构建周期中调用该工具,如果该检查在任何类上失败,则将其设为致命错误。

但我不确定这种 getter 是否会为您的代码提供任何级别的线程安全。当您连续调用两个 getter 时,您仍然可以读取不一致的值。

于 2010-04-12T13:42:52.423 回答
0

您可以为此目的编写一个 Eclipse 插件。

有一个用于构建器的 API(类似编译器的插件),您可以访问 Eclipse Java 编译器的 AST(抽象语法树)来执行检查。

如果您喜欢 Eclipse 插件,这应该没什么大不了的。

关于 AST
的文章 关于 Builders的文章

于 2010-04-12T14:09:26.443 回答
0

+1 对于 Brians 的建议,或者在运行时使用类似的东西,比如 Spring AOP。使用运行时框架,您的优势在于不需要单独的编译器,并且只需从上下文文件中删除一行即可从所有方法中删除包装。

于 2010-04-12T14:37:18.910 回答