在某些情况下,例如,在策略模式中,我必须提供接口的一些默认类。
在这种情况下,我通常会在不同的 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();
时都会获得新实例。
现在用例就在您手中。