摘要 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来改变动作怎么办?那么抽象方法选项就失效了。第二个选项还可以更轻松地独立于按钮测试操作。一般来说,更喜欢委派而不是继承。
假设我想创建一个按钮 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来改变动作怎么办?那么抽象方法选项就失效了。第二个选项还可以更轻松地独立于按钮测试操作。一般来说,更喜欢委派而不是继承。