답변:
당신은 할 수 없습니다. 네 가지 옵션이 여기 있다고 생각합니다. 네 가지 모두 솔루션을 제공하지만 약간 다른 접근 방식을 제공합니다 ...
옵션 1 : 내장형 name()
열거 형을 사용하십시오. 특별한 명명 형식이 필요하지 않은 경우에는 완벽하게 사용할 수 있습니다.
String name = Modes.mode1.name(); // Returns the name of this enum constant, exactly as declared in its enum declaration.
옵션 2 : 더 많은 제어를 원하면 열거 속성에 재정의 속성 추가
public enum Modes {
mode1 ("Fancy Mode 1"),
mode2 ("Fancy Mode 2"),
mode3 ("Fancy Mode 3");
private final String name;
private Modes(String s) {
name = s;
}
public boolean equalsName(String otherName) {
// (otherName == null) check is not needed because name.equals(null) returns false
return name.equals(otherName);
}
public String toString() {
return this.name;
}
}
옵션 3 : 열거 형 대신 정적 결승을 사용하십시오.
public final class Modes {
public static final String MODE_1 = "Fancy Mode 1";
public static final String MODE_2 = "Fancy Mode 2";
public static final String MODE_3 = "Fancy Mode 3";
private Modes() { }
}
옵션 4 : 인터페이스에는 모든 필드가 공개, 정적 및 최종적으로 있습니다.
public interface Modes {
String MODE_1 = "Fancy Mode 1";
String MODE_2 = "Fancy Mode 2";
String MODE_3 = "Fancy Mode 3";
}
모든 열거 형에는 name () 및 valueOf (String) 메서드가 모두 있습니다. 전자는 열거 형의 문자열 이름을 반환하고 후자는 이름이 문자열 인 열거 형 값을 제공합니다. 찾고있는 것과 같은가요?
String name = Modes.mode1.name();
Modes mode = Modes.valueOf(name);
Enum 자체에는 정적 valueOf (Class, String)가 있으므로 사용할 수도 있습니다.
Modes mode = Enum.valueOf(Modes.class, name);
some-really-long-string
.
toString()
각 열거 형 값 의 메서드를 재정의 할 수 있습니다 .
예:
public enum Country {
DE {
@Override
public String toString() {
return "Germany";
}
},
IT {
@Override
public String toString() {
return "Italy";
}
},
US {
@Override
public String toString() {
return "United States";
}
}
}
용법:
public static void main(String[] args) {
System.out.println(Country.DE); // Germany
System.out.println(Country.IT); // Italy
System.out.println(Country.US); // United States
}
Benny Neugebauer가 언급했듯이 toString ()을 덮어 쓸 수 있습니다. 그러나 대신 각 열거 형 필드의 toString을 덮어 쓰면 다음과 같습니다.
public enum Country{
SPAIN("España"),
ITALY("Italia"),
PORTUGAL("Portugal");
private String value;
Country(final String value) {
this.value = value;
}
public String getValue() {
return value;
}
@Override
public String toString() {
return this.getValue();
}
}
정적 필드를 추가하여 모든 필드를 검색하고 모두 인쇄하는 등의 작업도 수행 할 수 있습니다. getValue를 호출하여 각 Enum 항목과 관련된 문자열을 가져 오기만하면됩니다.
mode1.name()
또는 String.valueOf(mode1)
. 그것보다 나아지지 않아 두려워
사용할 수는 Mode.mode1.name()
있지만 종종이 작업을 수행 할 필요는 없습니다.
Mode mode =
System.out.println("The mode is "+mode);
name()
와 toString()
오버라이드 (override) 할 수 있지만, 희망이는 대한 코드를 읽는 분명있을 것입니다 enum
이런 일이됩니다.
name()
입니다 final
. 수정 해 주셔서 감사합니다. :)
내가 아는 한, 이름을 얻는 유일한 방법은
Mode.mode1.name();
그러나 실제로 이런 식으로 필요한 경우 다음을 수행 할 수 있습니다.
public enum Modes {
mode1 ("Mode1"),
mode2 ("Mode2"),
mode3 ("Mode3");
private String name;
private Modes(String s) {
name = s;
}
}
Mode.mode1
여전히 유형이 아닙니다 String
.
내 열거 형의 경우 각각 1 문자열로 할당되는 것을 생각하지 않습니다. 이것이 열거 형에 toString () 메서드를 구현하는 방법입니다.
enum Animal
{
DOG, CAT, BIRD;
public String toString(){
switch (this) {
case DOG: return "Dog";
case CAT: return "Cat";
case BIRD: return "Bird";
}
return null;
}
}
return
모든 열거 형으로 열거에 스위치가 종료되기 때문에, 중복입니다.
당신의 문제에 대한 나의 해결책!
import java.util.HashMap;
import java.util.Map;
public enum MapEnumSample {
Mustang("One of the fastest cars in the world!"),
Mercedes("One of the most beautiful cars in the world!"),
Ferrari("Ferrari or Mercedes, which one is the best?");
private final String description;
private static Map<String, String> enumMap;
private MapEnumSample(String description) {
this.description = description;
}
public String getEnumValue() {
return description;
}
public static String getEnumKey(String name) {
if (enumMap == null) {
initializeMap();
}
return enumMap.get(name);
}
private static Map<String, String> initializeMap() {
enumMap = new HashMap<String, String>();
for (MapEnumSample access : MapEnumSample.values()) {
enumMap.put(access.getEnumValue(), access.toString());
}
return enumMap;
}
public static void main(String[] args) {
// getting value from Description
System.out.println(MapEnumSample.getEnumKey("One of the fastest cars in the world!"));
// getting value from Constant
System.out.println(MapEnumSample.Mustang.getEnumValue());
System.out.println(MapEnumSample.getEnumKey("One of the most beautiful cars in the world!"));
System.out.println(MapEnumSample.Mercedes.getEnumValue());
// doesnt exist in Enum
System.out.println("Mustang or Mercedes, which one is the best?");
System.out.println(MapEnumSample.getEnumKey("Mustang or Mercedes, which one is the best?") == null ? "I don't know!" : "I believe that "
+ MapEnumSample.getEnumKey("Ferrari or Mustang, which one is the best?") + " is the best!.");
// exists in Enum
System.out.println("Ferrari or Mercedes, wich one is the best?");
System.out.println(MapEnumSample.getEnumKey("Ferrari or Mercedes, which one is the best?") == null ? "I don't know!" : "I believe that "
+ MapEnumSample.getEnumKey("Ferrari or Mercedes, which one is the best?") + " is the best!");
}
}
package com.common.test;
public enum Days {
monday(1,"Monday"),tuesday(2,"Tuesday"),wednesday(3,"Wednesday"),
thrusday(4,"Thrusday"),friday(5,"Friday"),saturday(6,"Saturday"),sunday(7,"Sunday");
private int id;
private String desc;
Days(int id,String desc){
this.id=id;
this.desc=desc;
}
public static String getDay(int id){
for (Days day : Days.values()) {
if (day.getId() == id) {
return day.getDesc();
}
}
return null;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
};
public enum Environment
{
PROD("https://prod.domain.com:1088/"),
SIT("https://sit.domain.com:2019/"),
CIT("https://cit.domain.com:8080/"),
DEV("https://dev.domain.com:21323/");
private String url;
Environment(String envUrl) {
this.url = envUrl;
}
public String getUrl() {
return url;
}
}
String prodUrl = Environment.PROD.getUrl();
인쇄됩니다 :
https://prod.domain.com:1088/
열거 형 문자열 상수에 대한이 디자인 은 대부분의 경우 작동합니다.
많은 시도 후이 솔루션을 제공했습니다
public static enum Operation {
Addition, Subtraction, Multiplication, Division,;
public String getUserFriendlyString() {
if (this==Addition) {
return " + ";
} else if (this==Subtraction) {
return " - ";
} else if (this==Multiplication) {
return " * ";
} else if (this==Division) {
return " / ";
}
return "undefined";
}
}
이 유형이 유형 오류를 방지하기가 더 쉽다는 것을 알았습니다.
public enum Modes {
some-really-long-string,
mode1,
mode2,
mode3;
String str;
Modes(){
this.str = super.name();
}
@Override
@NonNull
public String toString() {
return str;
}
그러나-이것은 log / println에서 String을 사용해야하거나 java가 toString () 메소드를 자동으로 컴파일 할 때마다 다음과 같은 코드 행에서 작동 할 수 있습니다->
// sample method that require (string,value)
intent.putExtra(Modes.mode1 ,shareElement.getMode()); // java error
// first argument enum does not return value
대신 위에서 언급했듯이 여전히 열거 형을 확장하고 다음과 .name()
같은 경우에 사용해야 합니다.
intent.putExtra(Modes.mode1.name() ,shareElement.getMode());
.name()
참조하십시오 : stackoverflow.com/a/6667365/887836