接口 VS 中定义的匿名类.接口外部的具体类

  • 本文关键字:接口 外部 VS 定义 java interface
  • 更新时间 :
  • 英文 :


在某些情况下,例如,在策略模式中,我必须提供接口的一些默认类。

在这种情况下,我通常会在不同的 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();好.

但是,我想知道第二个是否被广泛使用。

这实际上取决于您的用例。在第二种情况下,您将获得以下行为。

  1. 默认情况下,MyStrategy DEFAULTpublic static final。这意味着您无法在任何时间点reinitialize它。

  2. same reference将在您使用MyStrategy.DEFAULT的位置共享。如果对象mutable并且您mutating,那么您可能会遇到一些问题。

  3. 对象将在第一次使用时创建,并将not be eligible for GC直到类装入器卸载该类。

但是在MyStrategy strategy = new DefaultMyStrategy();的情况下,每次使用new DefaultMyStrategy();时都会获得新实例。

现在用例就在您手中。

最新更新