【发布时间】:2011-08-29 17:21:18
【问题描述】:
在 Java 方法中指定标志的最佳做法是什么?
我见过 SWT 使用 int 作为位域,例如:
(示例部分来自“Effective Java, 2nd Ed.”第 159 页):
public class Text {
public static final int STYLE_BOLD = 1 << 0; // 1
public static final int STYLE_ITALIC = 1 << 1; // 2
void printText(String text, int flags) {
}
}
你的客户电话看起来像:
printText("hello", Text.STYLE_BOLD | Text.STYLE_ITALIC);
..但不鼓励这样做,因为您可以将来自不同类的标志(int 值)混合在一起而无需任何编译器检查。
在同一本书(“Effective Java”)中,我看到了 EnumSet 的使用,但随后您的用户调用变为:
printText("hello", EnumSet.of(Style.Bold, Style.ITALIC));
我觉得这有点冗长,我更喜欢 SWT 的优雅。
还有其他选择吗?或者这基本上是您必须选择的两种口味?
【问题讨论】:
-
我想你的意思是
STYLE_ITALIC = 1 << 1。 -
@Victor 我认为这是位域方法常见问题的一个很好的证明!
-
谢谢@VictorZamanian 我更新了问题
-
你觉得第二个“冗长”的地方是什么?这是一个更长的字符。你觉得第一个“优雅”是什么?它所做的只是抛弃类型安全——这没有什么优雅的。