gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:32:16 25 4
gpt4 key购买 nike

我正在尝试做一些在 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 中建议在他的项目 30:使用枚举而不是 int 常量 中使用 enum 而不是 int 常量。但恕我直言,它是 enum 的正确方法,用于更复杂的情况,然后只需替换 c #define 构造。

更新:正如作者在他对我的回答的评论中提到的,他想知道是否使用 enumint 常量更好一般的。在这种情况下,这样的问题会重复(参见 Java: Enum vs. Int),而我的回答将是:一般 enum 更好,为什么 - 看看 Joshua Bloch 的 第 30 项,正如我之前提到的。

关于Java 枚举(或 int 常量)与 C 枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29945143/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com