今天我正在浏览这个网站上的一些问题,我发现提到了一个enum 单独使用模式的关于这种解决方案所谓的线程安全的好处.
我从来没有使用过enums,而且我已经用Java编程了好几年了.显然他们改变了很多.现在他们甚至在自己内部全力支持OOP.
我对C#非常熟悉,但开始在Java中工作更多.我希望得知Java中的枚举基本上与C#中的枚举相同,但显然情况并非如此.最初,我很高兴得知Java枚举可能包含多个数据,这似乎非常有利(http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html).但是,从那时起我发现C#中缺少许多功能,例如能够轻松地为枚举元素分配特定值,以及因此无需花费大量精力就能将整数转换为枚举(即整数值转换为相匹配的Java枚举).
所以我的问题是:对于带有一堆公共静态最终字段的类,Java枚举是否有任何好处?或者它只提供更紧凑的语法?
编辑:让我更清楚.Java枚举对于具有相同类型的一组公共静态最终字段的类有什么好处?例如,在第一个链接的行星示例中,枚举对具有这些公共常量的类有什么好处:
public static final Planet MERCURY = new Planet(3.303e+23, 2.4397e6);
public static final Planet VENUS = new Planet(4.869e+24, 6.0518e6);
public static final Planet EARTH = new Planet(5.976e+24, 6.37814e6);
public static final Planet MARS = new Planet(6.421e+23, 3.3972e6);
public static final Planet JUPITER = new Planet(1.9e+27, 7.1492e7);
public static final Planet SATURN = new Planet(5.688e+26, 6.0268e7);
public static final Planet URANUS = new Planet(8.686e+25, 2.5559e7);
public static final Planet NEPTUNE = …Run Code Online (Sandbox Code Playgroud) 我不得不编写一个程序来做LZWDecode,我决定使用LinkedList编写下面的LZWDecode程序,但我想将它转换为ArrayList.任何人都知道如何将LinkedList转换为ArrayList以使其更简单.谢谢.
import java.util.*;
public class LZWDecoder {
private final int CLEAR_TABLE=256;
private final int END_OF_DATA=257;
private final int TABLE_SIZE=4096;
private static LinkedList<Integer> input = new LinkedList<Integer>();
@SuppressWarnings("unchecked")
private LinkedList<Integer>[] table
= new LinkedList[TABLE_SIZE];
private LinkedList<Integer> temp = new LinkedList<Integer>();
private int index = 258;
private LinkedList<String> trace = new LinkedList<String>();
private boolean view = true;
private void enterData() {
Scanner scan = new Scanner(System.in);
System.out.println("Please enter the Input Code (EOD = 257):");
int n=0;
while(n!=END_OF_DATA && scan.hasNextInt()){
n = scan.nextInt(); …Run Code Online (Sandbox Code Playgroud) 我正试图在C中做一些通常看起来像这样的事情:
typedef enum {
HTTP =80,
TELNET=23,
SMTP =25,
SSH =22,
GOPHER=70} TcpPort;
Run Code Online (Sandbox Code Playgroud)
方法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);
}
}
Run Code Online (Sandbox Code Playgroud)
方法1 - 问题
我发现我不得不在不同的地方重复这种模式,但是想知道:有更好的方法吗?特别是因为:
我使用此映射的原因之一是因为它在switch语句中看起来更好,例如:
switch(tcpPort){
case HTTP:
doHttpStuff();
break; …Run Code Online (Sandbox Code Playgroud) 为什么说在java中使用枚举更好.如果你有不同数据类型的常量,我认为最好使用带常量的类而不是枚举?
喜欢
Class A {
public static int A = 1;
public static int B = 2;
public static String c = "RADIUS";
public static String d = "LENGTH";
}
Run Code Online (Sandbox Code Playgroud)
代替
enum ofInts {A(1), B(2)}
enum ofStrings{c("RADUIS"), d("LENGTH")}
Run Code Online (Sandbox Code Playgroud)