【发布时间】:2015-04-29 13:24:21
【问题描述】:
我正在尝试做一些在 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;
}
但我的感觉是enums 还是更好。我的enum 方法是否可行?还是有其他方法?
【问题讨论】:
-
你不能比较无与伦比的东西,因为
java没有任何define构造 -
如果使用 C 编写代码,则只需使用
#define。 Java 至少有两种方法可以解决相同的问题——使用enum或static int。在我开始使用上面的模式删除enums 之前,我正在与社区确认没有更好的方法,并且这是正确的方法。
标签: java enums coding-style