Saya mencoba mengidentifikasi alasan di balik konstanta di Jawa. Saya telah belajar bahwa Java memungkinkan kita untuk mendeklarasikan konstanta dengan menggunakan final
kata kunci.
Pertanyaan saya adalah mengapa Java tidak memperkenalkan fitur Constant ( const
). Karena banyak orang mengatakan itu berasal dari C ++, di C ++ kami memiliki const
kata kunci.
Silakan bagikan pemikiran Anda.
const
kata kunci, tetapi tidak ada fitur yang mendasarinya. Koreksi judul dan tag Anda sesuai.Jawaban:
Setiap kali saya beralih dari pengkodean C ++ yang berat ke Java, saya butuh sedikit waktu untuk beradaptasi dengan kurangnya const-correctness di Java. Penggunaan
const
dalam C ++ ini jauh berbeda dari sekadar mendeklarasikan variabel konstan, jika Anda tidak tahu. Pada dasarnya, ini memastikan bahwa suatu objek tidak berubah ketika diakses melalui jenis khusus dari pointer yang disebut const-pointer Ketika di Jawa, di tempat-tempat di mana saya biasanya ingin mengembalikan sebuah pointer-pointer, saya malah mengembalikan referensi dengan tipe antarmuka hanya mengandung metode yang seharusnya tidak memiliki efek samping. Sayangnya, ini tidak dipaksakan oleh langauge.Wikipedia menawarkan informasi berikut tentang subjek:
sumber
final
serupa.final
Metode misalnya bekerja sangat berbeda dariconst
metode C ++ .final
kunci pada properti atau variabel hanya memastikan bahwa properti atau variabel hanya ditugaskan satu kali . Seseorang masih dapat mengubah keadaan objek ini dengan, misalnya, memanggil beberapa metode dengan efek samping.final
agak mirip untuk menumpuk alokasi C ++ dalam hal merujuk ke objek daripada pointer, tapi hanya itu. Ini tentu saja di samping apa yang sudah dikatakan dom0.final
di Jawa tampaknya bekerja seperti C ++const
untuk tipe nilai, tetapi lebih seperti C ++ non-constT&
untuk tipe referensiApa
const
artinyaPertama, sadari bahwa semantik kata kunci "const" memiliki arti berbeda bagi orang yang berbeda:
final
semantik - variabel referensi itu sendiri tidak dapat dipindahkan untuk menunjuk ke instance lain (lokasi memori), tetapi instance itu sendiri dapat dimodifikasiconst
pointer / semantik referensi - berarti referensi ini tidak dapat digunakan untuk memodifikasi instance (mis. tidak dapat menetapkan variabel instan, tidak dapat memanggil metode yang dapat ditransmisikan) - hanya memengaruhi variabel referensi, sehingga referensi non-const menunjuk ke instance yang sama dapat memodifikasi instanceMengapa atau Mengapa Tidak
const
Kedua, jika Anda benar-benar ingin menggali beberapa argumen "pro" vs "con", lihat diskusi di bawah permintaan untuk peningkatan ini (bug) "bug". RFE ini meminta fitur "const-readable only" -type "const" fitur. Dibuka pada tahun 1999 dan kemudian ditutup / ditolak oleh Sun pada tahun 2005, topik "const" sangat diperdebatkan:
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4211070
Meskipun ada banyak argumen bagus di kedua sisi, beberapa alasan yang sering dikutip (tetapi tidak selalu meyakinkan atau jelas)
const
meliputi:const
berarti di atas)Sebelum ada yang mencoba memperdebatkan saya tentang apakah ini alasan baik atau buruk, perhatikan bahwa ini bukan alasan saya . Mereka hanyalah "inti" dari beberapa alasan yang saya dapatkan dari membaca diskusi RFE. Saya sendiri belum tentu setuju dengan mereka - Saya hanya mencoba mengutip mengapa beberapa orang (bukan saya) merasa
const
kata kunci mungkin bukan ide yang baik. Secara pribadi, saya ingin semantik "const" yang lebih banyak untuk diperkenalkan ke bahasa dengan cara yang jelas.sumber
volatile
sangat sederhana untuk dipahami? Ataufinal
? Ah.const
dalam C ++ tidak berarti bahwa suatu nilai adalah konstanta.const
dalam C ++ menyiratkan bahwa klien kontrak berjanji untuk tidak mengubah nilainya.Apakah nilai
const
ekspresi berubah menjadi lebih jelas jika Anda berada di lingkungan yang mendukung konkurensi berbasis utas.Karena Java dirancang sejak awal untuk mendukung konkurensi thread dan lock, Java tidak menambah kebingungan dengan membebani istilah untuk memiliki semantik yang
final
dimiliki.misalnya:
output 42 maka 7.
Meskipun
x
ditandai sebagaiconst
, sebagai alias non-const dibuat,x
bukan konstanta. Tidak setiap kompiler memerlukanvolatile
perilaku ini (meskipun setiap kompiler diizinkan untuk menyejajarkan konstanta)Dengan sistem yang lebih rumit, Anda mendapatkan alias const / non-const tanpa menggunakan
const_cast
, jadi biasakan berpikir bahwa const berarti sesuatu yang tidak akan berubah menjadi semakin berbahaya.const
hanya berarti bahwa kode Anda tidak dapat mengubahnya tanpa gips, bukan karena nilainya konstan.sumber
const
itu bukan berarti nilai konstan. Ini berarti bahwa klien dari suatu nilai dibatasi untuk tidak mengubahnya. Dalam contoh Anda tidak ada alias, sehingga semua pengguna berada di bawah kendala yang sama. Ini tidak terjadi secara umum.const
efek klien, bukan nilai - katanya Anda tidak bisa mengubahnya, bukan bahwa itu tidak akan berubah.immutable interface
danimmutable object
merupakan cara lain (dapat dikalahkan dengan pemain dan refleksi) untuk meniru const di Jawa. Const "True" dapat dilakukan dengan SealedObject , sayangnya itu menghancurkan use case dari objek kita.Ini sedikit pertanyaan lama, tapi saya pikir saya tetap akan menyumbangkan 2 sen saya karena utas ini muncul dalam percakapan hari ini.
Ini tidak persis menjawab mengapa tidak ada const? tetapi bagaimana membuat kelas Anda tidak berubah. (Sayangnya saya belum memiliki reputasi yang cukup untuk memposting sebagai komentar atas jawaban yang diterima)
Cara untuk menjamin kekekalan pada suatu objek adalah dengan merancang kelas Anda lebih hati-hati agar tidak berubah. Ini membutuhkan sedikit perawatan lebih dari kelas yang bisa berubah.
Ini kembali ke Item 15 Java Efektif Josh Bloch - Minimalkan Mutabilitas . Jika Anda belum membaca buku itu, ambil salinannya dan bacalah beberapa kali. Saya jamin itu akan meningkatkan "permainan java" kiasan Anda .
Dalam item 15, Bloch menyarankan agar Anda membatasi mutabilitas kelas untuk memastikan status objek.
Mengutip buku secara langsung:
Bloch kemudian menjelaskan cara membuat kelas Anda tidak berubah, dengan mengikuti 5 aturan sederhana:
final
).final
.private
.Untuk lebih jelasnya saya sangat merekomendasikan mengambil salinan buku.
sumber
Semantik C ++
const
sangat berbeda dengan Javafinal
. Jika perancang telah menggunakannya,const
itu tidak perlu membingungkan.Fakta bahwa itu
const
adalah kata yang dicadangkan menunjukkan bahwa para perancang punya ide untuk diimplementasikanconst
, tetapi sejak itu mereka memutuskan untuk tidak melakukannya; lihat bug tertutup ini . Alasan lain termasuk menambahkan dukungan untuk gaya C ++const
akan menyebabkan masalah kompatibilitas.sumber
Ada cara untuk membuat variabel "const" di Java, tetapi hanya untuk kelas-kelas tertentu. Cukup tentukan kelas dengan properti final dan subkelasnya. Kemudian gunakan kelas dasar di mana Anda ingin menggunakan "const". Demikian juga, jika Anda perlu menggunakan metode "const", tambahkan mereka ke kelas dasar. Kompiler tidak akan memungkinkan Anda untuk memodifikasi apa yang dianggapnya sebagai metode final kelas dasar, tetapi ia akan membaca dan memanggil metode pada subkelas.
sumber
Akan ada dua cara untuk mendefinisikan konstanta -
const
danstatic final
, dengan semantik yang sama persis. Selanjutnyastatic final
menggambarkan perilaku lebih baik daripadaconst
sumber
static
(bukan milik instance tertentu) danfinal
- tidak dapat diubah.Anda dapat menggunakan final statis untuk membuat sesuatu yang berfungsi mirip dengan Const, saya telah menggunakan ini di masa lalu.
sumber