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

在那种情况下,我通常在不同的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();都会获得新实例。

现在,用例就在您手中。

10-06 09:16