Definisi untuk in
dan out
bidang dalam System
kelas adalah:
public final static PrintStream out;
public final static InputStream in;
Ini adalah konstanta. Mereka kebetulan juga objek, tetapi mereka adalah konstanta. Ini sangat mirip dengan kelas Matematika:
public static final double E = 2.7182818284590452354;
public static final double PI = 3.14159265358979323846;
Atau di kelas Boolean:
public static final Boolean TRUE = new Boolean(true);
public static final Boolean FALSE = new Boolean(false);
Atau di kelas Warna:
public final static Color white = new Color(255, 255, 255);
public final static Color black = new Color(0, 0, 0);
public final static Color red = new Color(255, 0, 0);
Ketika mengakses konstanta publik yang tidak berubah, tidak ada keuntungan signifikan untuk merangkumnya - secara konseptual atau berbasis kinerja. Itu disana. Itu tidak akan berubah.
Tidak ada perbedaan nyata antara Color.white
dan System.out
.
enum
untuk menahan mereka ... meskipunenum
baru dengan Java 1.5 (bukan pilihan dalam 1.0 hari).final static
danstatic final
? Jika demikian, apakah itu?Alasan sebenarnya adalah bahwa ini adalah masalah warisan. The
System.in,out,err
konstanta adalah bagian dari Java 1.0 ... dan mungkin banyak kembali lebih lanjut. Pada saat itu jelas bahwa desain punya masalah, sudah terlambat untuk memperbaikinya. Yang terbaik yang bisa mereka lakukan adalah menambahkanSystem.setIn,setOut,setErr
metode di Java 1.1 dan kemudian menangani masalah spesifikasi bahasa 1 .Ini mirip dengan masalah mengapa ada
System.arraycopy
metode statis yang namanya melanggar konvensi penamaan Java.Seperti apakah ini "desain buruk" atau tidak, saya pikir itu. Ada situasi di mana penanganan non-OO saat ini merupakan masalah serius. (Pikirkan ... bagaimana Anda dapat menjalankan satu program Java di dalam yang lain ketika persyaratan aliran "IO" standarnya bertentangan. Pikirkan ... unit kode pengujian yang mengharuskan Anda mengubah aliran.)
Namun, saya juga dapat mengaitkan dengan argumen bahwa cara melakukan hal-hal saat ini lebih nyaman dalam banyak kasus.
1 - Sangat menarik untuk dicatat bahwa
System.in,out,err
variabel mendapatkan perhatian khusus di JLS sebagai memiliki "semantik khusus". JLS mengatakan bahwa jika Anda mengubah nilaifinal
bidang, perilaku tidak terdefinisi ... kecuali dalam kasus bidang ini .sumber
Saya percaya objek keluar tidak dapat diubah, yang membuatnya entah bagaimana aman (ini bisa diperdebatkan) karena disimpan di bidang statis final publik.
Banyak kelas di JDK tidak menghormati prinsip-prinsip desain berorientasi objek terbaik. Salah satu alasan untuk ini adalah kenyataan bahwa mereka ditulis hampir 20 tahun yang lalu, ketika Object-Orientation hanya muncul sebagai paradigma mainstream dan banyak programmer tidak terbiasa dengan mereka seperti sekarang. Contoh desain API yang buruk adalah API Tanggal & Waktu, yang membutuhkan waktu 19 tahun untuk mengubah ...
sumber
Jawaban ini bagus dan benar.
Saya ingin menambahkan bahwa dalam beberapa kasus kompromi dilakukan demi kegunaan.
Objek tipe String dapat dipakai tanpa kejadian baru, saat String bukan primitif:
String menjadi non-primitif, harus dipakai seperti ini:
Tetapi kompiler memungkinkan untuk opsi yang lebih pendek, lebih sedikit OO, karena String sejauh ini adalah kelas yang paling banyak digunakan di API.
Array juga dapat diinisialisasi dengan cara non-OO:
Cukup aneh, objek adalah turunan dari kelas atau array . Array makna adalah jenis kelas yang benar-benar terpisah.
Array memiliki
length
bidang publik yang tidak konstan. Juga tidak ada dokumentasi pada array kelas adalah turunan dari. (jangan bingung dengan kelas Array atau java.reflect.Array).sumber
new String("Hello")
akan selalu membuat objek String baru. SementaraString s = "Hello";
akan menggunakan objek yang diinternir. Bandingkan:"Hello" == "Hello"
mungkin benar, sementaranew String("Hello") == new String("Hello")
selalu salah. Ada kompilasi waktu optimasi sulap terjadi di pertama yang tidak mungkin dengannew String("Hello")
. Lihat en.wikipedia.org/wiki/String_interningString s = new String("Hello");
" yang tidak benar. Opsi yang lebih pendek (String s = "Hello";
) lebih tepat karena string interning.String
, tidak ada opsi "lebih benar". Keduanya benar. Meskipun, seperti dikatakan MichaelT, yang lebih pendek lebih disukai karena String magang.