Apakah OK untuk antarmuka bergantung pada kelas beton?

9

Saya membuat antarmuka di Jawa untuk penangan kesalahan khusus.

Ingin meneruskan objek kesalahan argumen tapi saya perlu menjadi anak Exceptionkelas.

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);

}
nikachx
sumber
Apakah Anda mencoba bertanya apakah boleh mewarisi kelas lain di antarmuka?
Mengintip
@StevieV Tidak. Saya mengedit pertanyaan, lihat.
nikachx
1
@AndresF. Ini hanya sebuah contoh dan dapat diterapkan pada bahasa OO tentang penggunaan kelas di antarmuka.
nikachx
3
Katakan padaku: apakah CustomExceptionbagian dari implementasi atau bagian dari antarmuka?
user253751
2
@nikachx Saya tidak mengerti apa yang Anda maksud dengan "aman". Dalam hal apa Stringlebih aman daripada CustomException? Mengapa penting jika CustomException, pada gilirannya, memiliki ketergantungan lain?
Andres F.

Jawaban:

2

Pertama-tama saya harus menunjukkan fakta yang CustomExceptiontidak meluas Exceptionsehingga tidak benar-benar sebuah Exception.

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 Stringatau Objectyang 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

  • Buat CustomExceptionabstrak
  • Tetap void onError(CustomException ex)seperti itu

pilihan 2

  • Buat CustomExceptionantarmuka
  • Tetap void onError(CustomException ex)seperti itu

Dengan salah satu opsi tersebut Anda akan menyesuaikan diri dengan DIP, karena antarmuka tidak akan bergantung pada kelas beton apa pun, hanya pada abstraksi.

Dalam aplikasi langsung inversi ketergantungan, abstrak dimiliki oleh lapisan atas / kebijakan. Arsitektur ini mengelompokkan komponen kebijakan yang lebih tinggi / dan abstrak yang mendefinisikan layanan yang lebih rendah bersama-sama dalam paket yang sama. Lapisan tingkat bawah dibuat oleh warisan / implementasi dari kelas atau antarmuka abstrak ini . Martin, Robert C. (2003).

  • Pengembangan Perangkat Lunak, Prinsip,> Pola, dan Praktek Perangkat Lunak. Prentice Hall. hlm. 127–131. ISBN 978-0135974445.
Tulains Córdova
sumber
1
Tidak ada banyak perbedaan antara menerima kelas abstrak atau kelas konkret (non-final), dan perbedaan antar muka tidak lebih dari itu. Selama instance dilewatkan sebagai parameter dan bukan hard-coded dalam implementasi Anda, Anda memiliki dasar untuk DI.
Jacob Raihle
@JacobRaihle Apa yang Anda maksudkan dengan memberikan instance hard-coded dalam implementasi?
Tulains Córdova
Saya berkata "selama ini dilewatkan dan tidak dikode dengan keras". Apa yang saya maksudkan adalah bahwa karena Interfaceantarmuka menerima CustomExceptiondan menyerahkannya kepada penelepon untuk menyediakannya, penelepon bebas untuk memberikan kelas apa pun yang meluas CustomExceptionbahkan jika CustomExceptionkelas beton - yang tidak akan mungkin terjadi jika Interfaceentah 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.
Jacob Raihle
@JacobRaihle "Dalam aplikasi inversi ketergantungan langsung, abstrak dimiliki oleh lapisan atas / kebijakan. Arsitektur ini mengelompokkan komponen kebijakan / tinggi dan abstrak yang mendefinisikan layanan rendah bersama-sama dalam paket yang sama. Lapisan bawah dibuat oleh warisan / implementasi kelas atau antarmuka abstrak ini . " Martin, Robert C. (2003). Pengembangan, Prinsip, Pola, dan Praktek Perangkat Lunak yang tangkas. Prentice Hall. hlm. 127–131. ISBN 978-0135974445.
Tulains Córdova
Apa gunanya kelas abstrak jika Anda bisa memberikan standar yang masuk akal? Apa yang Anda kehilangan dengan menyediakan itu? Jangan hanya mengutip buku, pikirkan.
Jacob Raihle
2

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!

Sava B.
sumber
0

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.

Arseni Mourzenko
sumber
Tidak, maksud saya bukan refleksi. Ya seperti yang Anda sebutkan Pengecualian dan struktur data dapat digunakan dalam antarmuka karena mereka hanya berisi data dan tidak platform atau tergantung pada kelas lain. Terima kasih.
nikachx
2
Jawaban yang menanyakan pertanyaan OP ... Cukup tanyakan dalam komentar, lalu berikan jawaban Anda.
Mengintip
1
@StevieV: Paragraf pertama lebih merupakan pertanyaan retoris. Dan seperti yang ditunjukkan oleh komentar OP, saya benar-benar menjawab pertanyaan OP.
Arseni Mourzenko