Czy jest coś takiego jak NotImplementedException .NET w Javie?

541

Czy jest coś takiego jak .NET NotImplementedExceptionw Javie?

pochłonęło elysium
źródło

Odpowiedzi:

516

Commons Lang ma to. Lub możesz rzucić UnsupportedOperationException.

Ravi Wallau
źródło
26
Wygląda na to, że NotImplementedException został usunięty z Commons Lang 3.0.
Michael Younkin
13
Myślę, że ponieważ UnsupportedOperationException jest częścią frameworku kolekcji, należy go używać tylko wtedy, gdy jest używany w kontekście kolekcji. W przeciwnym razie należy zastosować wyjątek RuntimeException. docs.oracle.com/javase/7/docs/technotes/guides/collections/…
L.Butz
9
@LeonardButz Pochodzi z java.lang: docs.oracle.com/javase/1.5.0/docs/api/java/lang/…
Ravi Wallau
5
@RaviWallau Widziałem to: docs.oracle.com/javase/7/docs/api/java/lang /... Okazuje się, że ta klasa jest członkiem Java Collection Framework.
L.Butz
3
Został odczytany w Commons Lang 3.2: commons.apache.org/proper/commons-lang/javadocs/api-3.2
qwertzguy
289

Myślę, że tego java.lang.UnsupportedOperationExceptionwłaśnie szukasz.

Chris Dail
źródło
28
Mówię, że to coś zupełnie innego. NIE mówi również, że może jeszcze nie zostać zaimplementowany, gdzie UOE mówi mi, że nigdy nie będzie ...
Dykam
5
@Dykam, to czy nie byłby to NotImplementedYetException?
Yishai
106
@Dykam: new UnsupportedOperationException("Not implemented yet")- szczęśliwy?
Michael Borgwardt
3
Nie miałem na myśli, że było gorzej, po prostu miałem inny przypadek użycia.
Dykam
6
nowy UnsupportedOperationException („Jeszcze nie zaimplementowano”) to świetny pomysł! :) z lang3 z jakiegoś powodu nie mam NotImplementedException, więc jest to świetne rozwiązanie
ufk
55

Możesz to zrobić sam (właśnie to zrobiłem) - aby nie przejmować się obsługą wyjątków, wystarczy rozszerzyć RuntimeException, twoja klasa mogłaby wyglądać mniej więcej tak:

public class NotImplementedException extends RuntimeException {

    private static final long serialVersionUID = 1L;

    public NotImplementedException(){}
}

Możesz go rozszerzyć, aby odebrał komunikat - ale jeśli użyjesz metody tak jak ja (to znaczy, że dla przypomnienia jest jeszcze coś do zaimplementowania), wtedy zwykle nie ma potrzeby dostarczania dodatkowych komunikatów.

Śmiem twierdzić, że używam tylko tej metody, a ja jestem w trakcie opracowywania systemu, dzięki czemu łatwiej mi nie zgodzić się z tym, które metody są nadal nieprawidłowo wdrażane :)

Ready4Android
źródło
3
Najbardziej podoba mi się to rozwiązanie, ponieważ łatwo jest mieć do niego specjalną procedurę obsługi błędów, łatwo go wyszukać, znajdując wszystkie odwołania do konstruktora NotImplementedException, a to tylko kilka wierszy kodu. Ale nieco niewygodne jest zadeklarowanie nowej klasy z własnym plikiem.
D Coetzee
1
Zgadzam się. To jest lepsze niż użycie UnsupportedOperationExceptionmoim zdaniem. Teraz, gdyby tylko Java dodała to do wspólnej biblioteki wyjątków!
zmiażdżyć
12

Jak wspomniano, JDK nie ma ścisłego dopasowania. Jednak mój zespół czasami korzysta również z takiego wyjątku. Moglibyśmy pójść UnsupportedOperationExceptionzgodnie z sugestiami innych odpowiedzi, ale wolimy niestandardową klasę wyjątków w naszej bibliotece podstawowej, która wycofała konstruktorów:

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

Podejście to ma następujące zalety:

  1. Kiedy czytelnicy widzą NotYetImplementedException, wiedzą, że wdrożenie zostało zaplanowane i zostało zapomniane lub wciąż trwa, podczas gdy UnsupportedOperationExceptionmówi (zgodnie z umowami windykacyjnymi ), że coś nigdy nie zostanie wdrożone. Dlatego w nazwie klasy mamy słowo „jeszcze”. IDE może również łatwo wyświetlać strony z połączeniami.
  2. Dzięki ostrzeżeniu o wycofaniu w każdej witrynie połączenia Twoje IDE i narzędzie do analizy kodu statycznego może przypomnieć Ci, gdzie nadal musisz coś zaimplementować. (To użycie wycofania może być dla niektórych niewłaściwe, ale w rzeczywistości wycofanie nie ogranicza się do ogłoszenia usunięcia .)
  3. Konstruktory są przestarzałe, a nie klasa. W ten sposób otrzymujesz tylko ostrzeżenie o wycofaniu w metodzie, która wymaga implementacji, a nie na importlinii (JDK 9 to naprawił ).
Jens Bannmann
źródło
8

Nie, nie ma go i prawdopodobnie go nie ma, ponieważ jest bardzo mało ważnych zastosowań. Myślałem dwa razy przed użyciem. Ponadto, naprawdę jest łatwo stworzyć siebie.

Zapoznaj się z tą dyskusją, dlaczego jest nawet w .NET.

Chyba się UnsupportedOperationExceptionzbliża, chociaż nie oznacza to, że operacja po prostu nie została zaimplementowana, ale nawet nie jest obsługiwana. Może to oznaczać, że nie jest możliwa poprawna implementacja. Dlaczego operacja nie byłaby obsługiwana? Czy powinno tam być? Może segregacja interfejsu lub podstawienie Liskowa?

Jeśli chodzi o prace w toku, wybrałbym ToBeImplementedException, ale nigdy nie przyłapałem się na definiowaniu konkretnej metody, a potem pozostawiłem ją na tak długo, aby znalazła się w produkcji i byłby potrzebny taki wyjątek.

Koszatka
źródło