我正在研究Swing的学习曲线,正在阅读InputMap
和ActionMap
。关于Swing的O'Reilly书中说ActionMap
的关键字可以是任意Object
,但按照惯例是String
s。
有没有理由使用String
以外的对象? (例如enum
)
我认为使用字符串文字是不好的做法,因为它们可能输入错误而不会产生任何编译错误。所以我猜测将ActionMap键存储为一次定义的不可变static final
类变量是个好习惯(例如MyAction.NAME
)。
编辑:为了澄清,我在阅读文档时想到的想法是使用enum
而不是String
。我应使用String
是否有原因?
答案 0 :(得分:2)
我不确定你为什么不直接使用枚举(没看过O'Reilly的书),但在这种情况下,我可能宁愿使用Enum.toString()方法,如在
MyActions.NAME.toString()
这节省了定义这么多静态变量的开销,如果您希望存储有关状态的更多信息,可以扩展MyActions枚举的功能,并且它保证每个枚举的唯一字符串。所有在拼写错误上都有编译时错误。
编辑:Swing早于Enum。这可以成为我们方便的全能答案吗?看看card layout的api。如果有一个设计要求枚举,它是一个卡片布局(允许循环通过一个组件列表显示在同一个地方)。我想有一些用例,其中字符串可能是首选的(例如用户添加的材料),但是来吧:大多数时候我将使用某种预定义的状态模式来使用它。
答案 1 :(得分:0)
实际上,你提出的是Swing本身所做的事情(有时候),所以你是对的。
检查javax.swing.DefaultEditorKit类。 Swing使用所有这些静态最终字符串来创建ActionMap。
但是,如果你检查一些外观的初始化,比如WindowsLookAndFeel,它们在源代码中也有硬编码的字符串文字。