Jawaban:
Kata finalkunci memiliki beberapa penggunaan di Jawa. Ini sesuai dengan kata kunci sealeddan readonlydalam 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 virtualmetode.
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 sealedkata kunci dalam C # jika Anda ingin berhenti menimpa metode yang telah ditandai secara eksplisit virtualdi 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 readonlykata kunci berbeda dari constkata kunci di mana readonlyekspresi dievaluasi pada saat runtime daripada waktu kompilasi , sehingga memungkinkan ekspresi sewenang-wenang.
readonlyvariabel anggota dapat dimodifikasi dalam konstruktor: pastebin.com/AzqzYGiA
Itu tergantung pada konteksnya.
finalkelas atau metode, padanan C # adalahsealed .finalbidang, ekuivalen C # adalahreadonly .finalvariabel lokal atau parameter metode, tidak ada persamaan langsung C #.For a final local variable or method parameter, there's no direct C# equivalentperbedaan besar.
consthanya 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, sealedsetara finaldengan metode dan kelas.
Sedangkan sisanya, itu rumit.
Untuk static finalbidang, static readonlyadalah 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 constpengubah cukup mirip untuk konstanta, tetapi Anda tidak dapat mengatur mereka dalam konstruktor statis.
readonlydapat digunakan. Itu tidak sama meskipun - finalmembutuhkan tepat satu tugas bahkan dalam konstruktor atau penginisialisasi.Tidak ada yang setara dengan C # untuk finalvariabel 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.