swt在Java方法中使用标志的最佳实践
在Java方法中指定标志的最佳实践是什么
我见过SWT使用int作为位字段,如:
(示例部分摘自“有效Java,第二版”,第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值)混合在一起,而无需任何编译器检查
在同一本书(“有效Java”)中,我看到了EnumSet的使用,但是您的用户调用变成:
printText("hello", EnumSet.of(Style.Bold, Style.ITALIC));
我觉得这有点冗长,我更喜欢SWT的优雅
还有其他选择吗?或者这基本上就是你必须选择的两种口味吗强>
# 1 楼答案
如果将采用一组样式的方法的数量有限(如
printText
,在您的示例中),则可以调整它们的签名以采用数量可变的样式参数:然后您的呼叫非常接近非类型(int)标志路由:
遗憾的是,没有
EnumSet.of(E... )
工厂,只有EnumSet.of(E first, E... more)
,因此您需要一个通用的logicalOr
方法来将数组拆分为first+rest块留给读者作为练习=)# 2 楼答案
我建议你采用
EnumSet
方法这种方法提供了更好的类型安全性,并且
Style
作为枚举将具有全面的OO功能# 3 楼答案
我猜你撞到墙了。我看不到任何其他选择。Java是冗长的,这是事实。在这种情况下,我通常会添加一个局部变量,以使代码更具可读性。你可以这样做
# 4 楼答案
任何遇到这个问题的人都不能及时回答。这里有一种方法可以减少内存并使用类似枚举的api:
方法:
电话:
# 5 楼答案
如果需要位样式标志,Java将它们包装在
BitSet
中。它已经存在很久了,但很少有人愿意使用它(更喜欢在int中嵌入C风格的位处理)The api for BitSet can be found here
再加上一些精心选择的静态int,它的性能相当不错,直到您开始在一次过程中检查和设置多个位为止