Cast außerhalb der equals-Methode: Unterschied zwischen den Versionen

Aus Programmieren-Wiki
K (Ys0704 verschob die Seite Unsafe Cast nach Cast außerhalb der equals-Methode)
Keine Bearbeitungszusammenfassung
 
Zeile 1: Zeile 1:
{{Bewertungsrichtlinie
{{CategoryBlock
|baustelle=Ja
|Baustelle=Ja
|blatt=3
|Java Grundlagen=Nein
|beschreibung=Das Anti-Pattern "Unsafe Cast" bezieht sich auf eine Situation, in der in Java ein unsicherer Typ-Cast durchgeführt wird. In Programmieren darf ein Cast nur als Teil des equals-Mechanismus verwendet werden.
|Organisation=Nein
|Programmierstil=Nein
|Bewertungsrichtlinie=Ja
|blattAnnotation=3
|blattAbzug=4
}}
{{Inhaltsblock
|vorher==== Beschreibung ===
Das Anti-Pattern "Unsafe Cast" bezieht sich auf eine Situation, in der in Java ein unsicherer Typ-Cast durchgeführt wird. In Programmieren darf ein Cast nur als Teil des equals-Mechanismus verwendet werden.


Das tritt auf, wenn ein Entwickler versucht, eine Referenz von einem allgemeinen Typ zu einem spezifischen Typ umzuwandeln, ohne die Typsicherheit zu überprüfen.  
Das tritt auf, wenn ein Entwickler versucht, eine Referenz von einem allgemeinen Typ zu einem spezifischen Typ umzuwandeln, ohne die Typsicherheit zu überprüfen.  


Ein unsicherer Typ-Cast kann zu Laufzeitfehlern führen, wenn die Referenz tatsächlich nicht mit dem angegebenen Typ kompatibel ist. Dadurch können <syntaxhighlight lang="Java" inline>ClassCastException</syntaxhighlight>-Fehler auftreten, die das Programm zum Absturz bringen oder zu unerwartetem Verhalten führen können-
Ein unsicherer Typ-Cast kann zu Laufzeitfehlern führen, wenn die Referenz tatsächlich nicht mit dem angegebenen Typ kompatibel ist. Dadurch können <syntaxhighlight lang="Java" inline>ClassCastException</syntaxhighlight>-Fehler auftreten, die das Programm zum Absturz bringen oder zu unerwartetem Verhalten führen können.
|schweregrad=leicht
}}
|negativ=Gehen wir davon aus, dass wir uns in einer Klasse "Cat" befinden:
{{Inhaltsblock
 
|color=red
<syntaxhighlight lang="Java">
|vorher==== Negativbeispiel ===
public boolean equals(Object object) {
Gehen wir davon aus, dass wir uns in einer Klasse "Cat" befinden:
|Beispiel=public boolean equals(Object object) {
     Cat other = (Cat) object;
     Cat other = (Cat) object;


     // The rest of the criteria for an object to be equal
     // The rest of the criteria for an object to be equal
}
}
</syntaxhighlight>
|beispielname=CastBad
 
|nachher=In diesem Fall wird ein Objekt, dessen Typ nicht bekannt ist aber erwartet wird, dass er ebenfalls Cat ist, gecastet. Da allerdings nicht vorher geprüft wird, kann es sein, dass object tatsächlich nicht vom Typ Cat ist und demnach bei diesem Cast einen Fehler erzeugt.
In diesem Fall wird ein Objekt, dessen Typ nicht bekannt ist aber erwartet wird, dass er ebenfalls Cat ist, gecastet. Da allerdings nicht vorher geprüft wird, kann es sein, dass object tatsächlich nicht vom Typ Cat ist und demnach bei diesem Cast einen Fehler erzeugt.


Bei einem unsicheren Cast wird eine Warnung vor einem ungeprüften Cast angezeigt, da der genauer Typ von object zur Kompilierungszeit nicht bekannt ist.
Bei einem unsicheren Cast wird eine Warnung vor einem ungeprüften Cast angezeigt, da der genauer Typ von object zur Kompilierungszeit nicht bekannt ist.


Um das Anti-Pattern "Unsafe Cast" zu vermeiden, ist es wichtig, sicerzustellen, dass der Typ-Cast sicher ist, indem vor dem Cast der Typ überprüft wird.
Um das Anti-Pattern "Unsafe Cast" zu vermeiden, ist es wichtig, sicerzustellen, dass der Typ-Cast sicher ist, indem vor dem Cast der Typ überprüft wird.
|positiv=Die Klasse "Cat" aus vorherigem Beispiel:
}}
 
{{Inhaltsblock
<syntaxhighlight lang="Java">
|color=green
public boolean equals(Object object) {
|vorher==== Positivbeispiel: ===
Die Klasse "Cat" aus vorherigem Beispiel:
|Beispiel=public boolean equals(Object object) {
     if (object == null) {
     if (object == null) {
         return false;
         return false;
Zeile 39: Zeile 49:
     // The rest of the criteria for an object to be equal
     // The rest of the criteria for an object to be equal
}
}
</syntaxhighlight>
|beispielname=CastGood
 
|nachher=Hier wird der Cast durch Guard-Clauses gesichert. Es wird zunächst überprüft ob das übergebene Objekt kompatibel ist, also auch vom Typ Cat. Ist dem nicht so, wird durch ein "early-return" Statement verhindert, dass der folgende Cast zu einem Fehler führen kann.
Hier wird der Cast durch Guard-Clauses gesichert. Es wird zunächst überprüft ob das übergebene Objekt kompatibel ist, also auch vom Typ Cat. Ist dem nicht so, wird durch ein "early-return" Statement verhindert, dass der folgende Cast zu einem Fehler führen kann.


Ist object allerdings vom Typ Cat, ist der Cast sicher. Wir haben ja bereits festgestellt, dass die Typen kompatibel in einem Cast sind.
Ist object allerdings vom Typ Cat, ist der Cast sicher. Wir haben ja bereits festgestellt, dass die Typen kompatibel in einem Cast sind.
|weiterlesen=Ja
|seite=Datentypen
}}
}}

Aktuelle Version vom 13. Oktober 2025, 13:46 Uhr

🚧 Diese Seite befindet sich in Bearbeitung 🚧
🤓 Diese Seite ist eine Bewertungsrichtlinie, die ab Blatt 3 annotiert und ab Blatt 4 abgezogen wird. 🤓

Beschreibung

Das Anti-Pattern "Unsafe Cast" bezieht sich auf eine Situation, in der in Java ein unsicherer Typ-Cast durchgeführt wird. In Programmieren darf ein Cast nur als Teil des equals-Mechanismus verwendet werden.

Das tritt auf, wenn ein Entwickler versucht, eine Referenz von einem allgemeinen Typ zu einem spezifischen Typ umzuwandeln, ohne die Typsicherheit zu überprüfen.

Ein unsicherer Typ-Cast kann zu Laufzeitfehlern führen, wenn die Referenz tatsächlich nicht mit dem angegebenen Typ kompatibel ist. Dadurch können ClassCastException-Fehler auftreten, die das Programm zum Absturz bringen oder zu unerwartetem Verhalten führen können.

Negativbeispiel

Gehen wir davon aus, dass wir uns in einer Klasse "Cat" befinden:

public boolean equals(Object object) {
    Cat other = (Cat) object;

    // The rest of the criteria for an object to be equal
}

In diesem Fall wird ein Objekt, dessen Typ nicht bekannt ist aber erwartet wird, dass er ebenfalls Cat ist, gecastet. Da allerdings nicht vorher geprüft wird, kann es sein, dass object tatsächlich nicht vom Typ Cat ist und demnach bei diesem Cast einen Fehler erzeugt.

Bei einem unsicheren Cast wird eine Warnung vor einem ungeprüften Cast angezeigt, da der genauer Typ von object zur Kompilierungszeit nicht bekannt ist.

Um das Anti-Pattern "Unsafe Cast" zu vermeiden, ist es wichtig, sicerzustellen, dass der Typ-Cast sicher ist, indem vor dem Cast der Typ überprüft wird.

Positivbeispiel:

Die Klasse "Cat" aus vorherigem Beispiel:

public boolean equals(Object object) {
    if (object == null) {
        return false;
    }

    if (object.getClass() != this.getClass()) {
        return false;
    }

    Cat other = (Cat) object;

    // The rest of the criteria for an object to be equal
}

Hier wird der Cast durch Guard-Clauses gesichert. Es wird zunächst überprüft ob das übergebene Objekt kompatibel ist, also auch vom Typ Cat. Ist dem nicht so, wird durch ein "early-return" Statement verhindert, dass der folgende Cast zu einem Fehler führen kann.

Ist object allerdings vom Typ Cat, ist der Cast sicher. Wir haben ja bereits festgestellt, dass die Typen kompatibel in einem Cast sind.