假设我想创建一个Button类,我有两个选择:
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() {
...
}
};
我的问题是,有一种坏的和好的方式,还是只取决于我?这两个按钮实例化之间是否存在性能差异(我经常需要实例化一串按钮)?
答案 0 :(得分:2)
我不担心像这样的微观优化性能。此决定不会对您的应用程序产生任何有意义的影响。
但是,我会使用section选项,您可以将操作传递给构造函数,原因有几个。它解决了问题。您的按钮对象不必担心它必须执行的操作的详细信息。如果要添加setter来更改操作,该怎么办?然后抽象方法选项分解。第二个选项还可以更轻松地从按钮单独测试操作。一般来说,赞成委托而不是继承。
答案 1 :(得分:0)
这种情况没有太大的性能差异。但是你应该记住,抽象类用于保存通用逻辑,即你想在每个动作执行后打印一些消息。如果没有通用逻辑,则应使用接口。