首页 > 解决方案 > 在接口 VS 中定义的匿名类。接口外的具体类

问题描述

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

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

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

标签: javainterface

解决方案


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

  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();.

现在用例在您手中。


推荐阅读