在某些情况下,例如,在策略模式中,我必须提供某个接口的默认类。
在那种情况下,我通常在不同的Java文件中制作一个接口的具体类,如下所示。
public interface MyStrategy {
void doSomething();
}
public class DefaultMyStrategy implements MyStrategy {
@Override
public void doSomething() {
}
}
但是最近,我看到了一些在接口中包含匿名类的代码,如下所示。
public interface MyStrategy {
MyStrategy DEFAULT = new MyStrategy() {
@Override
public void doSomething() {
}
};
void doSomething();
}
设置默认班级哪个更好?
如我所见,
MyStrategy strategy = MyStrategy.DEFAULT;
比MyStrategy strategy = new DefaultMyStrategy();
更好。但是,我想知道第二种方法是否被广泛使用。
最佳答案
那真的取决于您的用例。在第二种情况下,您将获得以下行为。
默认情况下,MyStrategy DEFAULT
将为public static final
。这意味着您无法在任何时间点reinitialize
。same reference
将在您使用MyStrategy.DEFAULT
的位置共享。如果对象是mutable
,而您是mutating
,则可能会遇到一些问题。
该对象将在第一次使用时创建,并且not be eligible for GC
直到类加载器卸载该类为止。
但是对于MyStrategy strategy = new DefaultMyStrategy();
,每次使用new DefaultMyStrategy();
都会获得新实例。
现在,用例就在您手中。