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

时间:2019-02-27 06:42:15

标签: 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 个答案:

答案 0 :(得分:0)

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

  1. 默认情况下,MyStrategy DEFAULT将是public static final。这意味着您无法在任何时间reinitialize

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

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

但是对于MyStrategy strategy = new DefaultMyStrategy();,每次使用new DefaultMyStrategy();时都会获得新实例。

现在用例就在您手中。