我正在尝试做一些在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-问题
我发现我不得不在多个地方重复这种模式,但我想知道:是否有更好的方法?特别是因为:
我使用此映射的原因之一是因为它在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
建议中使用enum
s而不是int
常量Item 30: Use enums instead of int constants
。但是恕我直言,这是enum
在更复杂的情况下使用的正确方法,然后只需替换c
#define
构造即可。
更新:正如作者在对此回答的评论中提到的那样,他想知道一般而言,使用常量enum
是否更好int
。在这种情况下,这样的问题变得重复了(请参阅Java:Enum vs. Int),我的回答将是:一般来说 enum
s更好,为什么?-Item 30
如我之前提到的,看看Joshua Bloch的问题。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句