Jawabannya sederhana
Di Java 9 atau lebih baru, setelah List.of()ditambahkan:
List<String> strings = List.of("foo", "bar", "baz");
Dengan Java 10 atau lebih baru, ini dapat disingkat dengan varkata kunci.
var strings = List.of("foo", "bar", "baz");
Ini akan memberi Anda kekal List , jadi itu tidak bisa diubah.
Apa yang Anda inginkan dalam banyak kasus di mana Anda melakukan pra-pengisian.
Java 8 atau sebelumnya:
List<String> strings = Arrays.asList("foo", "bar", "baz");
Ini akan memberi Anda Listdidukung oleh array, sehingga tidak dapat mengubah panjang.
Tapi Anda bisa menelepon List.set, jadi masih bisa berubah .
Anda dapat membuat Arrays.asListlebih pendek dengan impor statis:
List<String> strings = asList("foo", "bar", "baz");
Impor statis:
import static java.util.Arrays.asList;
Yang disarankan oleh setiap IDE modern dan otomatis untuk Anda
Misalnya di IntelliJ IDEA Anda menekan Alt+Enterdan memilih Static import method....
Namun, saya tidak menyarankan untuk memperpendek List.ofmetode of, karena itu menjadi membingungkan.
List.ofsudah cukup pendek dan membaca dengan baik.
Menggunakan Streams
Kenapa harus jadi List?
Dengan Java 8 atau lebih baru Anda dapat menggunakan Streamyang lebih fleksibel:
Stream<String> strings = Stream.of("foo", "bar", "baz");
Anda dapat menggabungkan Stream:
Stream<String> strings = Stream.concat(Stream.of("foo", "bar"),
Stream.of("baz", "qux"));
Atau Anda dapat beralih dari a Streamke List:
import static java.util.stream.Collectors.toList;
List<String> strings = Stream.of("foo", "bar", "baz").collect(toList());
Tetapi lebih disukai, gunakan saja Streamtanpa mengumpulkannya untuk List.
Jika Anda benar - benar membutuhkanjava.util.ArrayList
(Anda mungkin tidak.)
Mengutip JEP 269 (penekanan milik saya):
Ada satu set kecil kasus penggunaan untuk menginisialisasi contoh koleksi yang dapat diubah dengan seperangkat nilai yang telah ditentukan. Biasanya lebih disukai untuk memiliki nilai-nilai yang telah ditetapkan dalam koleksi yang tidak dapat diubah, dan kemudian menginisialisasi koleksi yang dapat diubah melalui copy constructor.
Jika Anda ingin keduanya menjadi pra-populasi ArrayList dan menambahkannya setelah itu (mengapa?), Gunakan
ArrayList<String> strings = new ArrayList<>(List.of("foo", "bar"));
strings.add("baz");
atau di Java 8 atau sebelumnya:
ArrayList<String> strings = new ArrayList<>(asList("foo", "bar"));
strings.add("baz");
atau menggunakan Stream:
import static java.util.stream.Collectors.toCollection;
ArrayList<String> strings = Stream.of("foo", "bar")
.collect(toCollection(ArrayList::new));
strings.add("baz");
Tapi sekali lagi, lebih baik menggunakan Streamlangsung daripada mengumpulkannya untuk List.
Program untuk antarmuka, bukan implementasi
Anda mengatakan telah mendeklarasikan daftar sebagai ArrayListdalam kode Anda, tetapi Anda hanya boleh melakukannya jika Anda menggunakan beberapa anggota ArrayListyang tidak ada dalam List.
Yang kemungkinan besar tidak Anda lakukan.
Biasanya Anda hanya harus mendeklarasikan variabel dengan antarmuka yang paling umum yang Anda akan digunakan (misalnya Iterable, Collectionatau List), dan menginisialisasi mereka dengan pelaksanaan tertentu (misalnya ArrayList, LinkedListatau Arrays.asList()).
Kalau tidak, Anda membatasi kode Anda ke jenis tertentu, dan akan lebih sulit untuk mengubah kapan pun Anda mau.
Misalnya, jika Anda melewati sebuah ArrayListke void method(...):
// Iterable if you just need iteration, for (String s : strings):
void method(Iterable<String> strings) {
for (String s : strings) { ... }
}
// Collection if you also need .size(), .isEmpty(), or .stream():
void method(Collection<String> strings) {
if (!strings.isEmpty()) { strings.stream()... }
}
// List if you also need .get(index):
void method(List<String> strings) {
strings.get(...)
}
// Don't declare a specific list implementation
// unless you're sure you need it:
void method(ArrayList<String> strings) {
??? // You don't want to limit yourself to just ArrayList
}
Contoh lain akan selalu menyatakan variabel InputStreammeskipun biasanya a FileInputStreamatau a BufferedInputStream, karena suatu hari nanti Anda atau orang lain akan ingin menggunakan beberapa jenis lain InputStream.
ArrasyList<String> places = ["Buenos Aires", "Córdoba", "La Plata"]