【发布时间】:2013-02-13 10:01:12
【问题描述】:
考虑下面的enums,哪个更好?两者的使用方式完全一样,但是它们的优势是什么?
1.覆盖抽象方法:
public enum Direction {
UP {
@Override
public Direction getOppposite() {
return DOWN;
}
@Override
public Direction getRotateClockwise() {
return RIGHT;
}
@Override
public Direction getRotateAnticlockwise() {
return LEFT;
}
},
/* DOWN, LEFT and RIGHT skipped */
;
public abstract Direction getOppposite();
public abstract Direction getRotateClockwise();
public abstract Direction getRotateAnticlockwise();
}
2。使用单一方法:
public enum Orientation {
UP, DOWN, LEFT, RIGHT;
public Orientation getOppposite() {
switch (this) {
case UP:
return DOWN;
case DOWN:
return UP;
case LEFT:
return RIGHT;
case RIGHT:
return LEFT;
default:
return null;
}
}
/* getRotateClockwise and getRotateAnticlockwise skipped */
}
编辑:我真的希望看到一些合理/详尽的答案,以及特定主张的证据/来源。由于缺乏证据,大多数现有的关于性能的答案并不真正令人信服。
您可以提出替代方案,但必须清楚它比所述的更好和/或所述的更差,并在需要时提供证据。
【问题讨论】:
-
第三种选择可能是将
opposite、cwise和ccwise之类的参数包含到Direction的构造函数中,将它们分配给最终实例变量并使用它们(通过直接访问或在“类”上定义的吸气剂)。 -
我也不喜欢,因为我不喜欢在枚举中寻找逻辑。但是第二个更简洁,不涉及枚举成员对抽象方法的覆盖,这对我来说有点痛苦:)
-
@gd1 如果枚举中没有逻辑,您将如何实现类似于我的示例的内容?如果您有其他选择,您可以在答案中提出建议。
-
我不得不说我会按照 akaIDIOT 建议的方式来做,它更清晰。