Apakah ada sesuatu seperti .NET's NotImplementedException di Java?


Jawaban:


516

Commons Lang memilikinya. Atau Anda bisa melempar UnsupportedOperationException.


26
Tampaknya NotImplementedException telah dihapus dari Commons Lang 3.0.
Michael Younkin

13
Saya pikir karena UnsupportedOperationException adalah bagian dari kerangka kerja koleksi, itu hanya boleh digunakan jika digunakan dalam konteks Koleksi. Kalau tidak, RuntimeException harus digunakan. docs.oracle.com/javase/7/docs/technotes/guides/collections/…
L.Butz

9
@LeonardButz Berasal dari java.lang: docs.oracle.com/javase/1.5.0/docs/api/java/lang/…
Ravi Wallau

5
@RaviWallau saya melihat ini: docs.oracle.com/javase/7/docs/api/java/lang/… Ada anggapan bahwa kelas ini adalah anggota Java Collection Framework.
L.Butz


289

Saya pikir java.lang.UnsupportedOperationExceptionapa yang Anda cari.


28
Saya mengatakan itu adalah sesuatu yang sangat berbeda. NIE juga mengatakan itu mungkin belum diimplementasikan, di mana UOE mengatakan saya tidak akan pernah ...
Dykam

5
@Dykam, lalu bukankah itu NotImplementedYetException?
Yishai

106
@Dykam: new UnsupportedOperationException("Not implemented yet")- bahagia?
Michael Borgwardt

3
Saya tidak bermaksud itu lebih buruk, hanya memiliki use case yang berbeda.
Dykam

6
UnsupportedOperationException baru ("Belum diimplementasikan") adalah ide yang luar biasa! :) di lang3 untuk beberapa alasan saya tidak memiliki NotImplementedException jadi ini adalah solusi yang bagus
ufk

55

Anda bisa melakukannya sendiri (itulah yang saya lakukan) - agar tidak terganggu dengan penanganan pengecualian, Anda cukup memperpanjang RuntimeException, kelas Anda bisa terlihat seperti ini:

public class NotImplementedException extends RuntimeException {

    private static final long serialVersionUID = 1L;

    public NotImplementedException(){}
}

Anda dapat memperluasnya untuk menerima pesan - tetapi jika Anda menggunakan metode ini seperti yang saya lakukan (yaitu, sebagai pengingat, bahwa masih ada sesuatu yang harus diimplementasikan), maka biasanya tidak perlu ada pesan tambahan.

Saya berani mengatakan, bahwa saya hanya menggunakan metode ini, sementara saya sedang dalam proses mengembangkan sistem, membuatnya lebih mudah bagi saya untuk tidak kehilangan jejak metode mana yang masih belum diterapkan dengan benar :)


3
Saya suka solusi ini yang terbaik karena mudah untuk memiliki penangan kesalahan khusus untuk itu, mudah untuk mencarinya dengan menemukan semua referensi ke konstruktor NotImplementedException, dan itu hanya beberapa baris kode. Tetapi agak merepotkan harus mendeklarasikan kelas baru dengan file sendiri.
D Coetzee

1
Saya setuju. Ini lebih baik daripada penggunaan UnsupportedOperationExceptionmenurut saya. Sekarang, andai saja Java akan menambahkan ini ke perpustakaan umum pengecualian!
naksir

12

Seperti yang disebutkan, JDK tidak memiliki kecocokan dekat. Namun, tim saya terkadang juga menggunakan pengecualian seperti itu. Kami dapat mengikuti UnsupportedOperationExceptionseperti yang disarankan oleh jawaban lain, tetapi kami lebih memilih kelas pengecualian khusus di pustaka dasar kami yang telah mencabut konstruktor:

public class NotYetImplementedException extends RuntimeException
{
    /**
     * @deprecated Deprecated to remind you to implement the corresponding code
     *             before releasing the software.
     */
    @Deprecated
    public NotYetImplementedException()
    {
    }

    /**
     * @deprecated Deprecated to remind you to implement the corresponding code
     *             before releasing the software.
     */
    @Deprecated
    public NotYetImplementedException(String message)
    {
        super(message);
    }
}

Pendekatan ini memiliki manfaat sebagai berikut:

  1. Ketika pembaca melihat NotYetImplementedException, mereka tahu bahwa suatu implementasi telah direncanakan dan telah dilupakan atau masih dalam proses, sedangkan UnsupportedOperationExceptionmengatakan (sesuai dengan kontrak penagihan ) bahwa sesuatu tidak akan pernah dilaksanakan. Itu sebabnya kami memiliki kata "yet" dalam nama kelas. Juga, sebuah IDE dapat dengan mudah mendaftar situs panggilan.
  2. Dengan peringatan penghentian di setiap situs panggilan, IDE dan alat analisis kode statis Anda dapat mengingatkan Anda di mana Anda masih harus mengimplementasikan sesuatu. (Penggunaan penghentian ini mungkin terasa salah bagi sebagian orang, tetapi pada kenyataannya penghentian tidak terbatas pada mengumumkan penghapusan .)
  3. Konstruktor sudah usang, bukan kelas. Dengan cara ini, Anda hanya mendapatkan peringatan penghentian di dalam metode yang perlu diimplementasikan, bukan di importjalur (JDK 9 memperbaiki ini , meskipun).

8

Tidak ada dan itu mungkin tidak ada, karena ada sangat sedikit kegunaan yang valid untuk itu. Saya akan berpikir dua kali sebelum menggunakannya. Juga, memang mudah untuk membuat diri sendiri.

Silakan merujuk ke diskusi ini tentang mengapa itu bahkan di .NET.

Saya kira UnsupportedOperationExceptionsudah dekat, meskipun tidak mengatakan operasi tidak diimplementasikan, tetapi bahkan tidak didukung. Itu bisa berarti implementasi yang valid tidak mungkin dilakukan. Mengapa operasi tidak didukung? Haruskah itu ada di sana? Segregasi antarmuka atau masalah substitusi Liskov mungkin?

Jika ini sedang dalam proses, saya akan melakukannya ToBeImplementedException, tetapi saya tidak pernah menemukan diri saya mendefinisikan metode konkret dan kemudian membiarkannya begitu lama sehingga membuatnya menjadi produksi dan akan ada kebutuhan untuk pengecualian seperti itu.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.