Чи є щось на зразок NotImplementedException .NET в Java?


Відповіді:


516

Commons Lang має. Або ви могли кинути UnsupportedOperationException.


26
Здається, що NotImplementedException було видалено з Commons Lang 3.0.
Майкл Юнкін

13
Я думаю, оскільки UnsupportedOperationException є частиною рамки колекцій, її слід використовувати лише в тому випадку, якщо він використовується в наступному колекції. В іншому випадку слід використовувати RuntimeException. docs.oracle.com/javase/7/docs/technotes/guides/collections/…
L.Butz

9
@LeonardButz Походить від java.lang: docs.oracle.com/javase/1.5.0/docs/api/java/lang/…
Раві Валлау,

5
@RaviWallau Я бачив це: docs.oracle.com/javase/7/docs/api/java/lang/… Існує думка, що цей клас є членом Java Collection Framework.
L.Butz

3
Він прочитаний у Commons Lang 3.2: commons.apache.org/proper/commons-lang/javadocs/api-3.2
qwertzguy

289

Я думаю, що java.lang.UnsupportedOperationExceptionсаме ти шукаєш.


28
Я кажу, це щось зовсім інше. NIE також повідомляє, що вона ще не може бути реалізована, де UOE каже мені, що це ніколи не буде ...
Dykam

5
@Dykam, то чи не буде це NotImplementedYetException?
Yishai

106
@Dykam: new UnsupportedOperationException("Not implemented yet")- щасливий?
Майкл Боргвардт

3
Я не мав на увазі, що це гірше, просто був інший випадок використання.
Дікам

6
нова UnsupportedOperationException ("Ще не реалізовано") - приголомшлива ідея! :) у lang3 чомусь у мене немає NotImplementedException, тому це чудове рішення
ufk

55

Ви можете зробити це самостійно (ось що я і зробив) - щоб не турбуватися обробкою винятків, ви просто розширите RuntimeException, ваш клас може виглядати приблизно так:

public class NotImplementedException extends RuntimeException {

    private static final long serialVersionUID = 1L;

    public NotImplementedException(){}
}

Ви можете розширити його, щоб прийняти повідомлення - але якщо ви використовуєте метод як я (тобто як нагадування про те, що ще потрібно щось реалізувати), зазвичай додаткові повідомлення не потребують.

Смію сказати, що я використовую лише цей метод, поки я перебуваю в процесі розробки системи, полегшує мені, щоб не прослідкувати, які методи досі не застосовуються належним чином :)


3
Мені подобається це рішення найкраще, тому що легко мати спеціальний обробник помилок для нього, його легко знайти, знайшовши всі посилання на конструктор NotImplementedException, і це лише кілька рядків коду. Але дещо незручно оголошувати новий клас із власним файлом.
D Coetzee

1
Я згоден. Це краще, ніж використання UnsupportedOperationExceptionна мою думку. Тепер, якби тільки Java додала б це до загальної бібліотеки винятків!
розчавити

12

Як вже було сказано, JDK не має близької відповідності. Однак час від часу моя команда використовує і такий виняток. Ми могли б піти з тим, UnsupportedOperationExceptionяк пропонують інші відповіді, але ми віддаємо перевагу користувальницькому класу виключень у нашій базовій бібліотеці, який має застарілі конструктори:

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

Цей підхід має такі переваги:

  1. Коли читачі бачать NotYetImplementedException, вони знають, що реалізація була запланована і була або забута, або все ще триває, тоді як UnsupportedOperationExceptionкаже (відповідно до договорів про збір ), що щось ніколи не буде здійснено. Ось чому в назви класу є слово "ще". Також IDE може легко перераховувати сайти для викликів.
  2. З попередженням про депресію на кожному сайті виклику ваш інструмент аналізу IDE та статичного коду може нагадувати вам, де вам все-таки потрібно щось реалізувати. (Це використання депресії може вважатись неправильним для деяких, але насправді припинення роботи не обмежується оголошенням про видалення .)
  3. Конструктори застарілі, а не клас. Таким чином, ви отримуєте лише попередження про депресацію всередині методу, який потребує впровадження, а не в importрядку ( хоча JDK 9 це виправлено ).

8

Ні, немає, і, мабуть, його немає, тому що існує дуже мало дійсних застосувань для цього. Я б подумав двічі, перш ніж використовувати його. Також створити себе справді просто.

Будь ласка, зверніться до цієї дискусії про те, чому це навіть у .NET.

Я думаю, що UnsupportedOperationExceptionнаближається, хоча це не говорить, що операція просто не реалізована, але навіть не підтримується. Це може означати, що неможлива реальна реалізація. Чому операція не підтримується? Чи повинен він навіть бути там? Можливо, питання поділу інтерфейсу чи заміни Ліскова?

Якщо це буде робота, яку я б продовжував ToBeImplementedException, але я ніколи не змушував себе визначати конкретний метод, а потім залишати його так довго, щоб він перетворився на виробництво, і був би необхідність у такому винятку.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.