摘要 class 和 Java 中的接口实例化性能

Abstract class and Interface instantiation performance in Java

假设我想创建一个按钮 class,我有两个选择:

    abstract class Button {

        Button() { }

        abstract void action();
    }

按下按钮时,将调用 action(),在这种情况下,我会像这样实例化我的按钮:

    new Button() {
        void action() {
            ...
        }
    };

另一个选项是:

    interface ButtonAction {
        run();
    }
    class Button {

        ButtonAction action;

        Button(ButtonAction action) {
            this.action = action;
        }

    }

按下按钮时,将调用 action.run(),我将像这样实例化按钮:

    new Button(new ButtonAction() {
        void action() {
            ...
        }
    };

我的问题是,有好的和坏的方法,还是只取决于我?这两个按钮实例化之间是否存在性能差异(我经常需要实例化一堆按钮)?

这种情况下没有太大的性能差异。但是你应该记住,抽象 类 用于保存通用逻辑,即你想在每个动作执行后打印一些消息。如果没有通用逻辑,您应该使用接口。

我不会担心像这样的性能微优化。此决定不会对您的应用性能产生任何有意义的影响。

但是,出于某些原因,我会在将操作传递给构造函数时使用 section 选项。它消除了担忧。您的按钮对象不必担心它必须执行的操作的细节。如果要添加一个setter来改变动作怎么办?那么抽象方法选项就失效了。第二个选项还可以更轻松地独立于按钮测试操作。一般来说,更喜欢委派而不是继承。