在Java中将字段的值定义为常量

时间:2011-07-21 11:59:28

标签: java oop constants

我在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);
...
你怎么看?这种方法有什么问题吗?你会如何在库中定义这些常量?

非常感谢

5 个答案:

答案 0 :(得分:8)

优先使用枚举intchar常量:

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';
        ...

而且,是的,枚举也很好。