使最终的类变量在GWT中保持静态

时间:2012-03-13 14:29:35

标签: java gwt

在Java中,final字段被赋予一个常量值编译时,通常将它声明为static。它根据相关的PMD规则节省了开销。

在GWT中对生成的Javascript代码有什么意义或区别吗?

2 个答案:

答案 0 :(得分:3)

如果变量在声明为final时被赋值,那么yes,static会有一定的意义,但是有些情况下它不应该是静态的:

public MyClassWithFinal {
    private final String finalVar;
    public MyClassWithFinal(String name) {
         this.finalVar = name;
    }
}

另一种情况:如果实例var不是字符串或数字常量,但需要运行构造函数,那么每次调用该构造函数时都可能产生副作用,因此只运行一次不同于多次运行它。 / p>

也就是说,GWT将内联/实习常量字符串值,因此如果您将多个String字段全部分配给相同的值,GWT可能会检测到并将它们全部提升为静态。

public final String constant = "Some Constant that really ought to be static";

GWT会注意到,除非声明,否则永远不会分配它,甚至可以删除字段本身。

最好的规则是从最佳(即最具可读性,最易维护,最有效)的Java代码开始,并且只有在GWT需要特定内容的情况下才能打破它。这不是其中之一:无论您如何编写,编译器都应执行相同的基本优化。

答案 1 :(得分:2)

标记为final的字段并不意味着它是不可变的,只是它的引用不会指向任何其他内存块。因此,如果一个字段是真正不可变的,或者它是一个原始字段,那么它只能是有意义的。

例如,如果要确保列表永远不会指向不同的列表对象,则通常会将列表声明为final,但列表本身仍然可以填充数据,清除,再次填充等等。当然,声明这样的列表的每个对象并不强制要在每个实例之间共享它。

private final List<...> list = new ArrayList<...>();

最后一个关键字是为了防止你犯错误,比如将一个永不改变的引用设置为null。