Esiste qualcosa come .NET NotImplementedException in Java?


Risposte:


516

Commons Lang ce l' ha. Oppure potresti lanciare un UnsupportedOperationException.


26
Sembra che NotImplementedException sia stato rimosso da Commons Lang 3.0.
Michael Younkin,

13
Penso che dal momento che UnsupportedOperationException fa parte del framework delle raccolte, dovrebbe essere utilizzato solo se utilizzato nel conext delle raccolte. Altrimenti dovrebbe essere usata una RuntimeException. docs.oracle.com/javase/7/docs/technotes/guides/collections/…
L.Butz


5
@RaviWallau Ho visto questo: docs.oracle.com/javase/7/docs/api/java/lang/…. Sorge che questa classe è un membro del Java Collection Framework.
L.Butz,


289

Penso che java.lang.UnsupportedOperationExceptionsia quello che stai cercando.


28
Dico che è qualcosa di completamente diverso. Il NIE dice anche che potrebbe non essere ancora implementato, dove l'UOE mi dice che non lo farà mai ...
Dykam

5
@Dykam, quindi non sarebbe NotImplementedYetException?
Yishai,

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

3
Non intendevo dire che era peggio, avevo solo un caso d'uso diverso.
Dykam,

6
new UnsupportedOperationException ("Non ancora implementato") è un'idea fantastica! :) in lang3 per qualche motivo non ho NotImplementedException quindi questa è un'ottima soluzione
ufk

55

Potresti farlo da solo (questo è quello che ho fatto) - per non essere disturbato dalla gestione delle eccezioni, estendi semplicemente RuntimeException, la tua classe potrebbe assomigliare a questa:

public class NotImplementedException extends RuntimeException {

    private static final long serialVersionUID = 1L;

    public NotImplementedException(){}
}

Potresti estenderlo per accettare un messaggio, ma se usi il metodo come faccio io (ovvero, come promemoria, c'è ancora qualcosa da implementare), di solito non sono necessari messaggi aggiuntivi.

Oserei dire che uso solo questo metodo, mentre sono in procinto di sviluppare un sistema, mi rende più facile non perdere traccia di quali metodi non sono ancora implementati correttamente :)


3
Questa soluzione mi piace al meglio perché è facile avere un gestore di errori speciale, è facile cercarla trovando tutti i riferimenti al costruttore NotImplementedException ed è solo poche righe di codice. Ma è un po 'scomodo dover dichiarare una nuova classe con il proprio file.
D Coetzee,

1
Sono d'accordo. Questo è meglio dell'uso UnsupportedOperationExceptionsecondo me. Ora, se solo Java lo aggiungesse alla libreria comune di eccezioni!
schiaccia il

12

Come accennato, il JDK non ha una corrispondenza ravvicinata. Tuttavia, il mio team occasionalmente ha un vantaggio anche per tale eccezione. Avremmo potuto procedere UnsupportedOperationExceptioncome suggerito da altre risposte, ma preferiamo una classe di eccezioni personalizzata nella nostra libreria di base che ha deprecato i costruttori:

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

Questo approccio ha i seguenti vantaggi:

  1. Quando i lettori vedono NotYetImplementedException, sanno che un'implementazione è stata pianificata ed è stata dimenticata o è ancora in corso, mentre UnsupportedOperationExceptiondice (in linea con i contratti di raccolta ) che qualcosa non verrà mai implementato. Ecco perché abbiamo la parola "ancora" nel nome della classe. Inoltre, un IDE può elencare facilmente i siti di chiamata.
  2. Con l'avvertimento di deprecazione in ogni sito di chiamata, l'IDE e lo strumento di analisi del codice statico possono ricordarti dove devi ancora implementare qualcosa. (Questo uso della deprecazione può sembrare sbagliato per alcuni, ma in realtà la deprecazione non si limita all'annuncio della rimozione .)
  3. I costruttori sono obsoleti, non la classe. In questo modo, viene visualizzato solo un avviso di deprecazione all'interno del metodo che deve essere implementato, non alla importriga (JDK 9 ha risolto questo problema , tuttavia).

8

No non c'è e probabilmente non c'è, perché ci sono pochissimi usi validi per questo. Ci penserei due volte prima di usarlo. Inoltre, è davvero facile creare te stesso.

Fare riferimento a questa discussione sul perché si trova anche in .NET.

suppongo UnsupportedOperationException si avvicini, anche se non dice che l'operazione non sia stata implementata, ma nemmeno supportata. Ciò potrebbe implicare che non sia possibile un'implementazione valida. Perché l'operazione non sarebbe supportata? Dovrebbe essere anche lì? Problemi di segregazione dell'interfaccia o di sostituzione di Liskov forse?

Se si tratta di lavori in corso, sceglierei ToBeImplementedException, ma non mi sono mai sorpreso a definire un metodo concreto e poi lasciarlo così a lungo da renderlo in produzione e sarebbe necessaria una tale eccezione.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.