instanceof vermeiden

Status
Nicht offen für weitere Antworten.

Johannes L.

Aktives Mitglied
Hallo,

wie kann man am besten instanceof Operatoren vermeiden? Ich rufe Methoden auf, wobei man innerhalb der Methode prüfen muss um welches Objekt es sich handelt um nur richtig zu casten und halt zu schauen welches Objekt null ist.

Also innerhalb der Methode:

Code:
	/**
	 * Get the status-line and the Headers.
	 * 
	 * @param to_client
	 * 	Output text stream.
	 * @param method
	 *  The method used.
	 */
	private void getResponseHeader(PrintWriter to_client, Object method)
	{
		Header[] headers = null;
		
		if(method instanceof GetMethod)
		{
			to_client.print(((GetMethod) method).getStatusLine().toString()+"\r\n");
			to_client.flush();
		
			headers = ((GetMethod) method).getResponseHeaders();
		}
		else if(method instanceof HeadMethod)
		{
			to_client.print(((HeadMethod) method).getStatusLine().toString()+"\r\n");
			to_client.flush();
			
			headers = ((HeadMethod) method).getResponseHeaders();
		}
		else if(method instanceof PostMethod)
		{
			to_client.print(((PostMethod) method).getStatusLine().toString()+"\r\n");
			to_client.flush();
			
			headers = ((PostMethod) method).getResponseHeaders();
		}
		
		for(Header header : headers)
		{
			logger.debug("Header: "+header.toString());
			to_client.print(header.toString());
			to_client.flush();
		}
		
		to_client.print("\r\n");
		to_client.flush();
	}

Wobei ich mir da gar nicht so wirklich sicher bin, ob es überhaupt Sinn macht das in eine Methode auszulagern oder eher gleich in jeden Case-Block zu schreiben.

Viele Grüsse,
Johannes
 
R

Roar

Gast
Code:
   private void getResponseHeader(PrintWriter to_client, HttpMethod method)
   {
      Header[] headers = method.getResponseHeaders();
      
        to_client.print(method.getStatusLine().toString()+"\r\n");
         to_client.flush();
      
      for(Header header : headers)
      {
         logger.debug("Header: "+header.toString());
         to_client.print(header.toString());
         to_client.flush();
      }
      
      to_client.print("\r\n");
      to_client.flush();
   }
?

edit: außerdem ist die methode sinnlos benannt
edit2: und warum schreibst du das ganze zeug selber in den stream :?:
 
S

SlaterB

Gast
wenn das deine eigenen Klassen sind, dann fasse sie in ein Interface zusammen
mit Operationen wie getType() oder isTypePostMethod() oder ähnliches,
dann kannst du einfache ints oder boolean vergleichen,
was etwas performanter ist,

letztlich wirst du aber um das if-else-Konstrukt + Cast nicht vorbeikommen, falls du das ganze nicht generell generischer lösen kannst,

wenn z.B. getResponseHeaders() im Interface angegeben wäre,
müsstes du wohl gar nicht casten/ nach den Typ fragen
 

Johannes L.

Aktives Mitglied
Naja, es ist ein Proxyserver und ich muss ja die ganzen Daten, die ich vom httpclient kriege an den Client weiterschicken. Wie kann ich das sonst weiterleiten?
 

Marco13

Top Contributor
JEDE Typabfrage ist eine Kapitulation vor der Objektorientierung - und getClass().getName() ist sogar noch ein bißchen schlimmer :autsch: Aber Roar hat die Lösung ja schon genannt :roll:
 

André Uhres

Top Contributor
Marco13 hat gesagt.:
JEDE Typabfrage ist eine Kapitulation vor der Objektorientierung..
Trotzdem sollte man instanceof sinnvoll einsetzen.
Jede equals-Methode, die Object#equals überschreibt, sollte z.B. eine solche Typabfrage haben:
Code:
public boolean equals(Object o){
  if(!(o instanceof MyType)){
    return false;
  ...
}
:wink:
 

Marco13

Top Contributor
Soweit ich mich erinnere sind sogar in den original Java-Sourcen von Sun einige "equals" Methoden so implementiert
Code:
public boolean equals(Object otherObject)
{
    try
    {
        ThisClass other = (ThisClass)otherObject;
         ...
    }
    catch (ClassCastException e)
    {
         return false;
    }
}
Ich wollte nur andeuten: Man braucht instanceof nicht. Und wenn doch, dann ist es ein Modellierungs"fehler". ("Fehler" in Anführungszeichen, weil JEDER an irgendeinem Punkt kapituliert, und der Aufwand mit instanceof u.U. um Größenordnungen geringer sein kann, als mit einer "richtigen" Modellierung)
 

André Uhres

Top Contributor
Marco13 hat gesagt.:
Soweit ich mich erinnere sind sogar in den original Java-Sourcen von Sun einige "equals" Methoden so implementiert
Code:
public boolean equals(Object otherObject)
{
    try
    {
        ThisClass other = (ThisClass)otherObject;
         ...
    }
    catch (ClassCastException e)
    {
         return false;
    }
}
..
Das würde mich sehr wundern, weil das recht unperformant ist.
Man braucht 'instanceof' wohl doch dazu :wink:

Der 'instanceof' Operator erlaubt es zu festzustellen, ob ein bestimmtes Casten erlaubt ist, ohne es erst zu versuchen.
Da die Perfomance viel besser ist als bei einer ClassCastException, ist es allgemein günstig,
eine 'instanceof' Abfrage zu machen, wenn man nicht sicher ist, ob der Typ einer Referenz so ist, wie man will.
Zuvor sollte man sich allerdings überlegen, ob man vernünftig mit einem ungewollten Typ umgehen kann.
Andernfalls wäre es besser, die Exception werfen zu lassen, um sie auf einer höheren Ebene zu behandeln.
 

Marco13

Top Contributor
Es IST aber so. Nur ... wie oft vergleicht man auch z.B. zwei FontRenderContext-Objekte...? :? Jedenfalls stellt sich für mich dann die Frage, ob "equals" überhaupt mit Objekten unterschiedlicher Klassen aufgerufen werden sollte !? ...
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
J instanceof vermeiden und stattdessen dynamisch binden Allgemeine Java-Themen 6
M Vermeiden von instanceof Abfragen Allgemeine Java-Themen 3
mihe7 equals und instanceOf pattern matching Allgemeine Java-Themen 9
M instanceof bei generischer Methode Allgemeine Java-Themen 3
E instanceof mit nicht öffentlichen Klassen Allgemeine Java-Themen 2
D instanceof oder was anderes? Allgemeine Java-Themen 12
S Kompositum Muster ohne Exception oder instanceof Operator Allgemeine Java-Themen 6
S instanceof liefert true, aber cast funktioniert nicht! Allgemeine Java-Themen 6
P instanceof mit variabler klasse Allgemeine Java-Themen 3
G Probleme mit ÜbergabeParameter für instanceof Allgemeine Java-Themen 3
T Klasse => Primitiv ? Object instanceof Klasse Allgemeine Java-Themen 2
T Generics und instanceof Allgemeine Java-Themen 10
M Ersatz fuer instanceof Allgemeine Java-Themen 11
Y instanceof unschön ! Allgemeine Java-Themen 6
S instanceof und null Allgemeine Java-Themen 7
S instanceof mit genrics Allgemeine Java-Themen 3
W Überflüssige Deklaration vermeiden...war da nicht mal was? Allgemeine Java-Themen 3
Zrebna Gibt es eine Möglichkeit eine NPE zu vermeiden, wenn null returned wird? Allgemeine Java-Themen 3
B einen color-chooser bauen, ähnliche Farben vermeiden Allgemeine Java-Themen 5
G Input/Output NIO.2: ShutdownChannelGroupException vermeiden Allgemeine Java-Themen 1
A Java - Beim Abspeichern Redundanzen vermeiden! Allgemeine Java-Themen 6
M Harten Cast vermeiden Allgemeine Java-Themen 7
D java.util.ConcurrentModificationException - per Copy vermeiden Allgemeine Java-Themen 11
J Generics / vermeiden von downcasts Allgemeine Java-Themen 2
R java.util.ConcurrentModificationException vermeiden? Allgemeine Java-Themen 8
N Casten durch generic vermeiden ?? Allgemeine Java-Themen 10
B Pattern gesucht, Programm Optionen, Casten vermeiden Allgemeine Java-Themen 3
T Wie kann ich einen doppelstart vermeiden? Allgemeine Java-Themen 9
T Concurrent Modification Exception vermeiden mit Prioritäten Allgemeine Java-Themen 4
B Vermeiden das JButton schneller hintereinander drücken Allgemeine Java-Themen 3

Ähnliche Java Themen

Neue Themen


Oben