Saya membuat antarmuka di Jawa untuk penangan kesalahan khusus.
Ingin meneruskan objek kesalahan argumen tapi saya perlu menjadi anak Exception
kelas.
Apakah saya tetap bisa menggunakan nama kelas yang saya tentukan di antarmuka?
Tidakkah itu membuatnya kurang dari antarmuka dalam hal tidak tergantung pada implementasi apa pun?
Saya mencoba melakukan sesuatu seperti ini:
public class CustomException {
/* ... Implementation ... */
}
public interface Interface {
void onError(CustomException ex);
}
java
design
object-oriented
interfaces
nikachx
sumber
sumber
CustomException
bagian dari implementasi atau bagian dari antarmuka?String
lebih aman daripadaCustomException
? Mengapa penting jikaCustomException
, pada gilirannya, memiliki ketergantungan lain?Jawaban:
Pertama-tama saya harus menunjukkan fakta yang
CustomException
tidak meluasException
sehingga tidak benar-benar sebuahException
.Yang mengatakan:
Jika Anda tidak peduli dengan Prinsip Ketergantungan Inversi , maka biarkan apa adanya. Sangat OK untuk antarmuka bergantung pada kelas beton, misalnya banyak antarmuka bergantung pada
String
atauObject
yang kelas beton . Masalahnya adalah kita cenderung percaya bahwa kelas-kelas yang termasuk dalam Java SDK lebih stabil (kurang rentan terhadap perubahan pemecah kode) daripada yang kita tulis.Di sisi lain:
Jika Anda ingin mengikuti DIP (yang memiliki banyak manfaat dan rekomendasi saya), maka Anda harus melakukan salah satu dari dua hal berikut:
Pilihan 1
CustomException
abstrakvoid onError(CustomException ex)
seperti itupilihan 2
CustomException
antarmukavoid onError(CustomException ex)
seperti ituDengan salah satu opsi tersebut Anda akan menyesuaikan diri dengan DIP, karena antarmuka tidak akan bergantung pada kelas beton apa pun, hanya pada abstraksi.
sumber
Interface
antarmuka menerimaCustomException
dan menyerahkannya kepada penelepon untuk menyediakannya, penelepon bebas untuk memberikan kelas apa pun yang meluasCustomException
bahkan jikaCustomException
kelas beton - yang tidak akan mungkin terjadi jikaInterface
entah bagaimana bertanggung jawab untuk membuat Itu. Ini inversi kontrol, lebih dari bekerja dengan antarmuka (walaupun itu pasti membantu), adalah apa yang saya pikir DI adalah semua tentang.Tulains benar - antarmuka bergantung pada kelas konkret setiap saat. Mereka hanya dimaksudkan untuk membuat kontrak untuk kepentingan mereka sendiri. Kontrak itu dapat melibatkan pengambilan dan pengembalian segala jenis data.
Ingat bahwa dalam bahasa tingkat yang lebih tinggi, bahkan tipe primitif pun tidak begitu primitif. Jadi Anda tetap bekerja dengan tipe beton!
sumber
Saya kira dengan namanya , maksud Anda kelas itu sendiri. Jika Anda mencoba menentukan nama kelas pengecualian yang sebenarnya untuk menginisialisasi pengecualian yang sesuai melalui Refleksi, ini bukan cara yang tepat.
Jika Anda ingin menggunakan kelas khusus dalam sebuah antarmuka, Anda tentu saja dapat menggunakan kelas Anda sendiri di antarmuka Anda sendiri. Kelas menjadi bagian dari antarmuka publik perpustakaan / API Anda. Struktur dan pengecualian data adalah contoh kelas yang baik yang sering digunakan oleh antarmuka.
Jika Anda perlu menggunakan pengecualian berbeda tergantung pada konteksnya, maka Anda mungkin tertarik menggunakan obat generik.
sumber