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 var
kata 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 List
didukung oleh array, sehingga tidak dapat mengubah panjang.
Tapi Anda bisa menelepon List.set
, jadi masih bisa berubah .
Anda dapat membuat Arrays.asList
lebih 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+Enter
dan memilih Static import method...
.
Namun, saya tidak menyarankan untuk memperpendek List.of
metode of
, karena itu menjadi membingungkan.
List.of
sudah cukup pendek dan membaca dengan baik.
Menggunakan Stream
s
Kenapa harus jadi List
?
Dengan Java 8 atau lebih baru Anda dapat menggunakan Stream
yang 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 Stream
ke List
:
import static java.util.stream.Collectors.toList;
List<String> strings = Stream.of("foo", "bar", "baz").collect(toList());
Tetapi lebih disukai, gunakan saja Stream
tanpa 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 Stream
langsung daripada mengumpulkannya untuk List
.
Program untuk antarmuka, bukan implementasi
Anda mengatakan telah mendeklarasikan daftar sebagai ArrayList
dalam kode Anda, tetapi Anda hanya boleh melakukannya jika Anda menggunakan beberapa anggota ArrayList
yang 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
, Collection
atau List
), dan menginisialisasi mereka dengan pelaksanaan tertentu (misalnya ArrayList
, LinkedList
atau 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 ArrayList
ke 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 InputStream
meskipun biasanya a FileInputStream
atau 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"]