Есть ли что-нибудь вроде .NET NotImplementedException в 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.
Л.Буц
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?
Ишай
106
@Dykam: new UnsupportedOperationException("Not implemented yet")- счастлив?
Майкл Боргвардт
3
Я не имел в виду, что это было хуже, просто был другой вариант использования.
Dykam
6
new UnsupportedOperationException («Еще не реализовано») - отличная идея! :) в lang3 почему-то у меня нет NotImplementedException, так что это отличное решение
ufk
55

Вы можете сделать это сами (это я и сделал) - чтобы не беспокоиться об обработке исключений, вы просто расширяете RuntimeException, ваш класс может выглядеть примерно так:

public class NotImplementedException extends RuntimeException {

    private static final long serialVersionUID = 1L;

    public NotImplementedException(){}
}

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

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

Ready4Android
источник
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, но я никогда не ловил себя на том, чтобы определить конкретный метод, а затем оставлял его так долго, что он превращал его в производство, и возникла бы необходимость в таком исключении.

соня
источник