(ด้ายเก่า แต่เพียง 2 เซ็นต์ไม่มีใครพูดถึง Guava หรือ libs อื่น ๆ และรายละเอียดอื่น ๆ )
ถ้าทำได้ให้ใช้ฝรั่ง
มันคุ้มค่าที่จะชี้ให้เห็นวิธีของ Guava ซึ่งทำให้ shenanigans เหล่านี้ง่ายขึ้นมาก:
การใช้
สำหรับรายการที่ไม่เปลี่ยนรูป
ใช้ImmutableList
คลาสและวิธีการของมันof()
และcopyOf()
โรงงาน(องค์ประกอบต้องไม่เป็นโมฆะ) :
List<String> il = ImmutableList.of("string", "elements"); // from varargs
List<String> il = ImmutableList.copyOf(aStringArray); // from array
สำหรับรายการที่ไม่แน่นอน
ใช้Lists
คลาสและnewArrayList()
วิธีการของโรงงาน:
List<String> l1 = Lists.newArrayList(anotherListOrCollection); // from collection
List<String> l2 = Lists.newArrayList(aStringArray); // from array
List<String> l3 = Lists.newArrayList("or", "string", "elements"); // from varargs
โปรดทราบวิธีการที่คล้ายกันสำหรับโครงสร้างข้อมูลอื่น ๆ ในชั้นเรียนอื่น ๆ Sets
เช่นใน
จุดดึงดูดหลักอาจลดความยุ่งเหยิงเนื่องจากข้อมูลทั่วไปสำหรับความปลอดภัยประเภทเนื่องจากการใช้วิธีการโรงงานของ Guava ทำให้สามารถสรุปประเภทส่วนใหญ่ได้ตลอดเวลา อย่างไรก็ตามอาร์กิวเมนต์นี้เก็บน้ำน้อยลงตั้งแต่ Java 7 มาถึงพร้อมกับตัวดำเนินการเพชรใหม่
แต่ไม่ใช่เหตุผลเดียว (และ Java 7 ยังไม่เกิดขึ้นทุกที่): ชวเลขไวยากรณ์นั้นมีประโยชน์มากและเมธอด initializers ดังที่เห็นด้านบนอนุญาตให้เขียนโค้ดที่แสดงออกได้มากกว่า คุณทำสิ่งหนึ่งในการเรียก Guava สิ่งที่เกิดขึ้น 2 กับ Java Collections ปัจจุบัน
หากคุณไม่สามารถ ...
สำหรับรายการที่ไม่เปลี่ยนรูป
ใช้Arrays
คลาสของ JDK และasList()
วิธีการของโรงงานห่อด้วยCollections.unmodifiableList()
:
List<String> l1 = Collections.unmodifiableList(Arrays.asList(anArrayOfElements));
List<String> l2 = Collections.unmodifiableList(Arrays.asList("element1", "element2"));
โปรดทราบว่าชนิดกลับมาasList()
เป็นList
ใช้คอนกรีตArrayList
การดำเนินงาน แต่มันไม่ได้เป็น java.util.ArrayList
มันเป็นประเภทภายในซึ่งเลียนแบบArrayList
แต่จริงๆแล้วอ้างอิงโดยตรงกับอาร์เรย์ที่ส่งผ่านและทำให้ "เขียนผ่าน" (การแก้ไขจะแสดงในอาร์เรย์)
มันห้ามการแก้ไขด้วยวิธีการบางอย่างของList
API ด้วยการขยายAbstractList
(ดังนั้นการเพิ่มหรือลบองค์ประกอบที่ไม่ได้รับการสนับสนุน) อย่างไรก็ตามมันช่วยให้การเรียกไปset()
ยังองค์ประกอบแทนที่ ดังนั้นรายการนี้ไม่ได้เปลี่ยนรูปอย่างแท้จริงและเรียกร้องให้ควรห่อหุ้มด้วยasList()
Collections.unmodifiableList()
ดูขั้นตอนต่อไปหากคุณต้องการรายการที่ไม่แน่นอน
สำหรับรายการที่ไม่แน่นอน
เหมือนข้างต้น แต่ถูกห่อด้วยของจริงjava.util.ArrayList
:
List<String> l1 = new ArrayList<String>(Arrays.asList(array)); // Java 1.5 to 1.6
List<String> l1b = new ArrayList<>(Arrays.asList(array)); // Java 1.7+
List<String> l2 = new ArrayList<String>(Arrays.asList("a", "b")); // Java 1.5 to 1.6
List<String> l2b = new ArrayList<>(Arrays.asList("a", "b")); // Java 1.7+
เพื่อจุดประสงค์ด้านการศึกษา: The Good ol 'Manual Way
// for Java 1.5+
static <T> List<T> arrayToList(final T[] array) {
final List<T> l = new ArrayList<T>(array.length);
for (final T s : array) {
l.add(s);
}
return (l);
}
// for Java < 1.5 (no generics, no compile-time type-safety, boo!)
static List arrayToList(final Object[] array) {
final List l = new ArrayList(array.length);
for (int i = 0; i < array.length; i++) {
l.add(array[i]);
}
return (l);
}