Mengapa kelas Java tidak dapat memiliki bidang abstrak seperti mereka dapat memiliki metode abstrak?
Sebagai contoh: Saya memiliki dua kelas yang memperluas kelas dasar abstrak yang sama. Kedua kelas ini masing-masing memiliki metode yang identik kecuali untuk konstanta String, yang kebetulan merupakan pesan kesalahan, di dalamnya. Jika bidang bisa abstrak, saya bisa membuat abstrak konstan ini dan menarik metode ke kelas dasar. Sebaliknya, saya harus membuat metode abstrak, yang disebut getErrMsg()
dalam kasus ini, yang mengembalikan String, menimpa metode ini dalam dua kelas turunan, dan kemudian saya dapat menarik metode (yang sekarang disebut metode abstrak).
Mengapa saya tidak bisa membuat bidang abstrak untuk memulai? Mungkinkah Java dirancang untuk memungkinkan ini?
Jawaban:
Anda dapat melakukan apa yang Anda gambarkan dengan memiliki bidang terakhir di kelas abstrak Anda yang diinisialisasi dalam konstruktornya (kode yang belum diuji):
Jika kelas anak Anda "lupa" untuk menginisialisasi final melalui konstruktor super, kompilator akan memberikan
peringatankesalahan, seperti ketika metode abstrak tidak diimplementasikan.sumber
Base
perlu diumumkanabstract
.Saya melihat tidak ada gunanya itu. Anda dapat memindahkan fungsi ke kelas abstrak dan mengganti beberapa bidang yang dilindungi. Saya tidak tahu apakah ini berfungsi dengan konstanta tetapi efeknya sama:
Jadi maksud Anda adalah bahwa Anda ingin menerapkan implementasi / overriding / apa pun dari
errorMsg
subclass? Saya pikir Anda hanya ingin memiliki metode di kelas dasar dan tidak tahu bagaimana menangani bidang itu.sumber
protected String errorMsg;
yang memberlakukan entah bagaimana saya menetapkan nilai di subclass. Ini mirip dengan kelas abstrak yang benar-benar mengimplementasikan semua metode sebagai placeholder sehingga pengembang tidak harus mengimplementasikan setiap metode meskipun mereka tidak membutuhkannya.protected String errorMsg;
tidak tidak menegakkan bahwa Anda mengatur nilai di subclass.Jelas itu bisa dirancang untuk memungkinkan ini, tetapi di bawah selimut itu masih harus melakukan pengiriman dinamis, dan karenanya panggilan metode. Desain Jawa (setidaknya di masa-masa awal), sampai batas tertentu, merupakan upaya untuk menjadi minimalis. Artinya, para desainer mencoba menghindari penambahan fitur baru jika mereka dapat dengan mudah disimulasikan oleh fitur lain yang sudah ada dalam bahasa tersebut.
sumber
Membaca judul Anda, saya pikir Anda mengacu pada anggota contoh abstrak; dan saya tidak melihat banyak gunanya bagi mereka. Tetapi anggota statis abstrak adalah masalah lain sama sekali.
Saya sering berharap dapat mendeklarasikan metode seperti berikut ini di Java:
Pada dasarnya, saya ingin menegaskan bahwa implementasi konkret dari kelas induk saya menyediakan metode pabrik statis dengan tanda tangan tertentu. Ini akan memungkinkan saya untuk mendapatkan referensi ke kelas beton dengan
Class.forName()
dan memastikan bahwa saya dapat membangunnya dalam konvensi yang saya pilih.sumber
@autowired T fieldName
. JikaT
didefinisikan sebagai sesuatu sepertiT extends AbstractController
, penghapusan jenis menyebabkan bidang dihasilkan sebagai jenisAbstractController
dan yang tidak dapat dipasang secara otomatis karena tidak konkret dan tidak unik. Saya umumnya setuju bahwa tidak banyak gunanya bagi mereka, dan karenanya mereka tidak termasuk dalam bahasa tersebut. Apa yang saya tidak setuju adalah bahwa TIDAK ADA gunanya bagi mereka.Pilihan lain adalah untuk mendefinisikan bidang sebagai publik (final, jika Anda suka) di kelas dasar, dan kemudian menginisialisasi bidang itu di konstruktor kelas dasar, bergantung pada subkelas mana yang saat ini digunakan. Ini agak teduh, karena memperkenalkan ketergantungan melingkar. Tapi, setidaknya itu bukan ketergantungan yang bisa berubah - yaitu, subkelas akan ada atau tidak ada, tetapi metode atau bidang subkelas tidak dapat memengaruhi nilai
field
.sumber