Java枚举(或int常量)与c枚举

rt

我正在尝试做一些在C中通常看起来像这样的事情:

typedef enum {
    HTTP  =80, 
    TELNET=23, 
    SMTP  =25, 
    SSH   =22, 
    GOPHER=70} TcpPort;

方法1

这是我在Java中使用的内容enum

public static enum TcpPort{
    HTTP(80),
    TELNET(23),
    SMTP(25),
    SSH(22),
    GOPHER(70);

    private static final HashMap<Integer,TcpPort> portsByNumber;
    static{
        portsByNumber = new HashMap<Integer,TcpPort>();
        for(TcpPort port : TcpPort.values()){
            portsByNumber.put(port.getValue(),port);
        }
    }
    private final int value;
    TcpPort(int value){
        this.value = value;
    }
    public int getValue(){
        return value;
    }
    public static TcpPort getForValue(int value){
        return portsByNumber.get(value);
    }
}

方法1-问题

我发现我不得不在多个地方重复这种模式,但我想知道:是否有更好的方法?特别是因为:

  1. 这似乎令人费解并且不太优雅,并且
  2. 它也将某些本可以编译的时间转移到运行时”。

我使用此映射的原因之一是因为它在switch语句中看起来更好,例如:

switch(tcpPort){
    case HTTP:
        doHttpStuff();
        break;
    case TELNET:
        doTelnetStuff();
        break;
    ....
}

我想用枚举还可以增强类型安全性。

方法2我知道我可以做到:

public static class TcpPort{
    public static final int HTTP   = 80;
    public static final int TELNET = 23;
    public static final int SMTP   = 25;
    public static final int SSH    = 22;
    public static final int GOPHER = 70;
}

但我的感觉是enum还是更好。我的enum方法超越了前进的道路吗?还是有另一种方法?

安德鲁蒙尼

我的感觉是,在您的情况下,仅出于switch声明的目的enum是多余的,最好仅使用final static int常量。例如内存经济。

另外,约书亚·布洛赫(Joshua Bloch)在Effective Java建议中使用enums而不是int常量Item 30: Use enums instead of int constants但是恕我直言,这是enum在更复杂的情况下使用的正确方法,然后只需替换c #define构造即可。

更新:正如作者在对此回答的评论中提到的那样,他想知道一般而言,使用常量enum是否更好int在这种情况下,这样的问题变得重复了(请参阅Java:Enum vs. Int),我的回答将是:一般来说 enums更好,为什么?-Item 30如我之前提到看看Joshua Bloch的问题

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章