วิธีที่ดีที่สุดในการมีenum
ประเภทเป็นชุดของสตริงคืออะไร?
ฉันลองสิ่งนี้:
enum Strings{
STRING_ONE("ONE"), STRING_TWO("TWO")
}
ฉันจะใช้มันเป็นStrings
อย่างไร
วิธีที่ดีที่สุดในการมีenum
ประเภทเป็นชุดของสตริงคืออะไร?
ฉันลองสิ่งนี้:
enum Strings{
STRING_ONE("ONE"), STRING_TWO("TWO")
}
ฉันจะใช้มันเป็นStrings
อย่างไร
คำตอบ:
ฉันไม่รู้ว่าคุณต้องการทำอะไร แต่นี่คือวิธีที่ฉันแปลรหัสตัวอย่างของคุณ ....
package test;
/**
* @author The Elite Gentleman
*
*/
public enum Strings {
STRING_ONE("ONE"),
STRING_TWO("TWO")
;
private final String text;
/**
* @param text
*/
Strings(final String text) {
this.text = text;
}
/* (non-Javadoc)
* @see java.lang.Enum#toString()
*/
@Override
public String toString() {
return text;
}
}
text
หรือคุณสามารถสร้างวิธีทะเยอทะยานสำหรับ
ตอนนี้คุณสามารถทำได้ Strings.STRING_ONE.toString();
final
ก็จะดีที่สุด
new
private
โดยพื้นฐานแล้วการสร้างวัตถุเป็นสิ่งต้องห้ามและfinal
ไม่จำเป็นในกรณีนี้
setText(String)
enum และนั่นสามารถปลดปล่อยนรก :) final
ประเภทของเอกสารที่คุณตั้งใจว่ามันคงที่ด้วยการสนับสนุนคอมไพเลอร์ ถ้าคุณจะใช้String
ค่าคงที่คุณจะไม่ประกาศว่าเป็นpublic static String
ใช่มั้ย
ค่าสตริงแบบกำหนดเองสำหรับ Enum
จากhttp://javahowto.blogspot.com/2006/10/custom-string-values-for-enum.html
ค่าสตริงเริ่มต้นสำหรับ java enum คือค่าใบหน้าหรือชื่อองค์ประกอบ อย่างไรก็ตามคุณสามารถปรับแต่งค่าสตริงได้โดยการแทนที่เมธอด toString () ตัวอย่างเช่น,
public enum MyType {
ONE {
public String toString() {
return "this is one";
}
},
TWO {
public String toString() {
return "this is two";
}
}
}
การรันโค้ดทดสอบต่อไปนี้จะทำให้เกิดสิ่งนี้:
public class EnumTest {
public static void main(String[] args) {
System.out.println(MyType.ONE);
System.out.println(MyType.TWO);
}
}
this is one
this is two
bin
ไดเรกทอรี: EnumTest $ MyType.class EnumTest $ MyType $ 1.class EnumTest $ MyType $ 2.class ซึ่งจะเพิ่มขึ้นอย่างรวดเร็วจริง ดีที่สุดที่จะทำมันเป็นคำตอบที่คาดหวังโดยการส่งผ่านค่าไปยังตัวสร้าง enum ที่จริงผมไม่เห็นด้วยกับการเอาชนะtoString()
; ฉันเชื่อว่าการใช้ getter ที่ชัดเจนนั้นดีกว่าเช่นgetKey()
เนื่องจากการลบล้างtoString()
อาจไม่คาดคิดโดยผู้ใช้ enum รายอื่น
ใช้name()
วิธีการ:
public class Main {
public static void main(String[] args) throws Exception {
System.out.println(Strings.ONE.name());
}
}
enum Strings {
ONE, TWO, THREE
}
ONE
อัตราผลตอบแทน
Strings.STRING_ONE.name()
ให้ผลตอบแทน "STRING_ONE" ไม่ใช่ "ONE" นี่ไม่ใช่คำตอบที่ดี คุณไม่มีสตริงใด ๆ ที่จะไม่ใช่ตัวระบุ Java ที่ถูกต้องและอื่น ๆ
name()
อาจได้รับผลกระทบจากโปรแกรม obfuscator ฉันพบปัญหาที่คล้ายกันเมื่อไม่นานมานี้ ตัวอย่างเช่นด้วย Proguard คุณต้องหลีกเลี่ยงปัญหานี้ ดูการประมวลผลคลาสการแจกแจง
ตั้งค่าชื่อ enum ให้เหมือนกับสตริงที่คุณต้องการหรือโดยทั่วไปคุณสามารถเชื่อมโยงแอททริบิวต์ที่ไม่มีกฎเกณฑ์กับค่า enum ของคุณ:
enum Strings {
STRING_ONE("ONE"), STRING_TWO("TWO");
private final String stringValue;
Strings(final String s) { stringValue = s; }
public String toString() { return stringValue; }
// further methods, attributes, etc.
}
สิ่งสำคัญคือการมีค่าคงที่ที่ด้านบนและวิธีการ / คุณลักษณะที่ด้านล่าง
ขึ้นอยู่กับสิ่งที่คุณหมายถึงโดย "ใช้พวกเขาเป็นสตริง" คุณอาจไม่ต้องการใช้ enum ที่นี่ ในกรณีส่วนใหญ่การแก้ปัญหาที่เสนอโดย The Elite Gentleman จะช่วยให้คุณสามารถใช้พวกเขาผ่านทาง toString-methods เช่นในSystem.out.println(STRING_ONE)
หรือString s = "Hello "+STRING_TWO
เมื่อคุณต้องการ Strings (เช่นSTRING_ONE.toLowerCase()
) คุณอาจต้องการกำหนดให้เป็นค่าคงที่:
public interface Strings{
public static final String STRING_ONE = "ONE";
public static final String STRING_TWO = "TWO";
}
toLowerCase()
วิธีแก้ปัญหาของฉันพวกเขาก็สามารถไปStrings.STRING_TWO.toString().toLowerCase()
ได้
interface
แทนfinal
คลาสกับตัวprivate
สร้าง มันเป็นการฝึกที่ท้อแท้
คุณสามารถใช้สำหรับ Enum สตริง
public enum EnumTest {
NAME_ONE("Name 1"),
NAME_TWO("Name 2");
private final String name;
/**
* @param name
*/
private EnumTest(final String name) {
this.name = name;
}
public String getName() {
return name;
}
}
และโทรจากวิธีหลัก
public class Test {
public static void main (String args[]){
System.out.println(EnumTest.NAME_ONE.getName());
System.out.println(EnumTest.NAME_TWO.getName());
}
}
หากคุณไม่ต้องการใช้ตัวสร้างและคุณต้องการมีชื่อพิเศษสำหรับวิธีลองสิ่งนี้:
public enum MyType {
ONE {
public String getDescription() {
return "this is one";
}
},
TWO {
public String getDescription() {
return "this is two";
}
};
public abstract String getDescription();
}
ฉันสงสัยว่านี่เป็นวิธีแก้ปัญหาที่เร็วที่สุด ไม่มีความจำเป็นที่จะใช้เป็นตัวแปรสุดท้าย
รับและตั้งค่าเริ่มต้น
public enum Status {
STATUS_A("Status A"), STATUS_B("Status B"),
private String status;
Status(String status) {
this.status = status;
}
public String getStatus() {
return status;
}
}
private String text
ควรเป็นที่สิ้นสุด