Jawaban:
Kata final
kunci memiliki beberapa penggunaan di Jawa. Ini sesuai dengan kata kunci sealed
dan readonly
dalam C #, tergantung pada konteks di mana ia digunakan.
Untuk mencegah subclassing (warisan dari kelas yang ditentukan):
Jawa
public final class MyFinalClass {...}
C #
public sealed class MyFinalClass {...}
Cegah pengubahan virtual
metode.
Jawa
public class MyClass
{
public final void myFinalMethod() {...}
}
C #
public class MyClass : MyBaseClass
{
public sealed override void MyFinalMethod() {...}
}
Seperti yang ditunjukkan oleh Joachim Sauer, perbedaan penting antara kedua bahasa di sini adalah bahwa Java secara default menandai semua metode non-statis virtual
, sedangkan C # menandai mereka sebagai sealed
. Oleh karena itu, Anda hanya perlu menggunakan sealed
kata kunci dalam C # jika Anda ingin berhenti menimpa metode yang telah ditandai secara eksplisit virtual
di kelas dasar.
Untuk hanya mengizinkan variabel ditugaskan satu kali:
Jawa
public final double pi = 3.14; // essentially a constant
C #
public readonly double pi = 3.14; // essentially a constant
Sebagai catatan tambahan, efek dari readonly
kata kunci berbeda dari const
kata kunci di mana readonly
ekspresi dievaluasi pada saat runtime daripada waktu kompilasi , sehingga memungkinkan ekspresi sewenang-wenang.
readonly
variabel anggota dapat dimodifikasi dalam konstruktor: pastebin.com/AzqzYGiA
Itu tergantung pada konteksnya.
final
kelas atau metode, padanan C # adalahsealed
.final
bidang, ekuivalen C # adalahreadonly
.final
variabel lokal atau parameter metode, tidak ada persamaan langsung C #.For a final local variable or method parameter, there's no direct C# equivalent
perbedaan besar.
const
hanya dapat digunakan pada tipe nilai. Sejauh yang saya tahu tidak ada cara untuk membuat konstanta yang efektif untuk tipe referensi lokal.
Apa yang tidak ada di semua orang di sini adalah jaminan Java atas penugasan yang pasti untuk variabel anggota akhir.
Untuk kelas C dengan variabel anggota akhir V, setiap jalur eksekusi yang mungkin melalui setiap konstruktor C harus menetapkan V tepat sekali - gagal menetapkan V atau menetapkan V dua atau lebih kali akan menghasilkan kesalahan.
Kata kunci hanya-baca C # tidak memiliki jaminan seperti itu - kompiler lebih dari senang untuk membiarkan anggota yang hanya dibaca tidak ditugaskan atau memungkinkan Anda untuk menetapkannya beberapa kali dalam konstruktor.
Jadi, final dan readonly (setidaknya sehubungan dengan variabel anggota) jelas tidak setara - final jauh lebih ketat.
Seperti yang disebutkan, sealed
setara final
dengan metode dan kelas.
Sedangkan sisanya, itu rumit.
Untuk static final
bidang, static readonly
adalah hal terdekat yang mungkin. Ini memungkinkan Anda untuk menginisialisasi bidang statis dalam konstruktor statis, yang cukup mirip dengan penginisialisasi statis di Jawa. Ini berlaku untuk konstanta (primitif dan objek tidak berubah) dan referensi konstan untuk objek bisa berubah.
The const
pengubah cukup mirip untuk konstanta, tetapi Anda tidak dapat mengatur mereka dalam konstruktor statis.
readonly
dapat digunakan. Itu tidak sama meskipun - final
membutuhkan tepat satu tugas bahkan dalam konstruktor atau penginisialisasi.Tidak ada yang setara dengan C # untuk final
variabel lokal yang saya ketahui. Jika Anda bertanya-tanya mengapa ada orang yang membutuhkannya: Anda dapat mendeklarasikan variabel sebelum if-else, switch-case atau lebih. Dengan menyatakan itu final, Anda menegaskan bahwa itu ditetapkan paling banyak satu kali.
Variabel lokal Java secara umum harus ditugaskan setidaknya satu kali sebelum dibaca. Kecuali jika cabang melompat sebelum nilai dibaca, variabel terakhir ditetapkan tepat sekali. Semua ini diperiksa waktu kompilasi. Ini membutuhkan kode berperilaku baik dengan sedikit margin untuk kesalahan.
Disimpulkan, C # tidak memiliki padanan langsung dengan final
. Sementara Java tidak memiliki beberapa fitur bagus dari C #, itu menyegarkan bagi saya karena kebanyakan programmer Java untuk melihat di mana C # gagal untuk memberikan yang setara.
Final kelas Java dan metode final -> disegel. Final variabel anggota Java -> hanya untuk konstanta runtime, const untuk konstanta waktu kompilasi.
Tidak ada padanan untuk final Variabel Lokal dan argumen metode akhir
Konstanta C # dideklarasikan menggunakan kata kunci const untuk konstanta waktu kompilasi atau kata kunci readonly untuk konstanta runtime. Semantik konstanta sama dalam bahasa C # dan Java.