4 java
我在其他地方读过静态匿名类没有意义 - 所有匿名类都应该绑定到封闭类型的实例.但编译器允许你这样做.这是一个例子:
class Test {
/*
* What's the difference at between
* Test.likeThis and Test.likeThat?
*/
// This is obviously okay:
private static final class LikeThat {
@Override
public String toString() { return "hello!"; }
}
public static Object likeThat = new LikeThat();
// What about this - is it really any different?
public static Object likeThis = new Object() {
@Override
public String toString() { return "hello!"; }
};
}
Run Code Online (Sandbox Code Playgroud)
这里发生了什么?
声明在静态上下文中发生的内部类I 的实例没有词法封闭的实例.但是,如果我在静态方法或静态初始化程序中立即声明,那么我确实有一个封闭块,这是最内部的块语句,在词法上包含I的声明.
您的匿名类(一个likeThis是其实例)发生在静态上下文中,因此它不依赖于封闭实例.但是,似乎它可以引用其封闭块的最终变量(参见8.1.3节的其余部分,它们给出了一个例子).
顺便说一句,你的措辞有点欺骗性,你实际上指的是一个匿名类的静态实例(它是静态的实例,而不是类).
像任何语言的任何东西一样,你应该考虑为什么要这样做.如果您有很多这些实例,那么我会质疑设计决策,但这并不一定意味着它是一个永远不应该遵循的模式.
当然,始终考虑类的可测试性以及是否可以在需要时提供测试加倍