我在Java中将标准实现为面向对象的库。标准包括通过终端通过网络传递的许多消息。每条消息都作为单个类实现。
某些字段表示为char类型,这些字段具有标准中定义的值之一。例如,
public class OutgoingMessage {
private char action;
并且操作具有这些值,
'0' - Do not print
'1' - Print
'2' - Print and Forward
'3' - Print and Reply
'F' - Forward
'R' - Reply
另外一些类有两个以上这样的字段。在这些情况下,将它们定义为类中的常量可能会很混乱。
所以我试图将这些值实现为
public class OutgoingMessage {
private char action;
public final class ActionTypes {
public static final char DO_NOT_PRINT = '0';
public static final char PRINT = '1';
...
使用如下
...
message.setAction(OutgoingMessage.ActionTypes.DO_NOT_PRINT);
...
message.setFooBar(OutgoingMessage.FooBarTypes.FOO_BAR);
...
你怎么看?这种方法有什么问题吗?你会如何在库中定义这些常量?
非常感谢
答案 0 :(得分:8)
优先使用枚举int
或char
常量:
public enum Action {
DoNotPrint,
Print,
PrintAndForward,
PrintAndReply,
Forward,
Reply
}
public class OutgoingMessage {
private Action action;
如果您需要将char
与操作相关联,请执行以下操作:
public enum Action {
DoNotPrint('0'),
Print('1'),
PrintAndForward('2'),
PrintAndReply('3'),
Forward('F'),
Reply('R');
private static Map<Character, Action> map = new HashMap<Character, Action>() {{
for (Action action : Action.values()) {
put(action.getChar(), action);
}
}};
private final char c;
private Action(char c) {
this.c = c;
}
public char getChar() {
return c;
}
public static Action parse(char c) {
if (!MapHolder.map.containsKey(c))
throw new IllegalArgumentException("Invalid char: " + c);
return MapHolder.map.get(c);
}
}
以下是使用解析方法的方法:
public static void main(String[] args) {
System.out.println(Action.parse('2')); // "PrintAndForward"
System.out.println(Action.parse('x')); // throws IllegalArgumentException
}
答案 1 :(得分:2)
您需要使用enum
。如果您还需要能够获取字符代码,则可以将其添加到enum
,如下所示:
public enum Action {
DO_NOT_PRINT('0'),
PRINT('1'),
PRINT_AND_FORWARD('2'),
PRINT_AND_REPLY('3'),
FORWARD('F'),
REPLY('R');
private final char code;
private Action(char code) {
this.code = code;
}
public char getCode() {
return code;
}
}
您只需在程序中使用枚举常量,当您需要char代码时,可以在枚举值上调用getCode
:
Action action = Action.DO_NOT_PRINT;
message.setAction(action);
// Suppose you need the char code:
char code = action.getCode();
答案 2 :(得分:1)
我相信这很好。但为了简单起见,如果您至少使用JDK1.5
,也可以使用Enum答案 3 :(得分:1)
您还可以更深入地考虑体系结构并拥有一个Action类(稍后还将避免使用大的switch语句并将某些代码与标准和消息分离)。
然后我会删除动作类型,而不是稍后通过简单地添加Action实现来轻松扩展。
interface Action {
public void performAction(Standard standard, OutgoingMessage msg);
}
class PrintAction implements Action {
// Implement the interface methods properly...
}
class ForwardAction implements Action {
// Implement the interface methods properly...
}
然后,您只需在邮件中添加操作实例:
msg.addAction(new PrintAction());
msg.addAction(new ForwardAction());
如果需要以某种方式对消息进行操作,请将它们设置为Serializable(而不是使Action接口扩展为Serializable)。
答案 4 :(得分:0)
你所拥有的是好的,但如果你只是想声明常量,你可以使用一个界面。
public class OutgoingMessage {
private char action;
public final interface ActionTypes {
public static final char DO_NOT_PRINT = '0';
public static final char PRINT = '1';
...
而且,是的,枚举也很好。