2016-04-22 9 views
2

Ich hatte eine Methode (nennen Sie es foo) wie folgt: public void foo (String parm) Ich weiß, habe Gelegenheit, manchmal eine Ganzzahl, die ich in eine Zeichenfolge konvertieren (nicht nur "" + x, es ist komplizierter als das und Sie können den String-Wert nicht nur durch den Blick auf den int-Wert ermitteln. Der int-Wert wird als Index verwendet.Abfangen eines Fehlers bei der Kompilierung statt Laufzeit in Java

Also jetzt mache ich das:

public void foo(Object obj) { 
if (obj instanceof String) { 
    ... 
} else if (obj instanceof Integer) { 
    ... 
} else // some sort of error 
} 

die, wenn Sie mögen tun etwas keinen Fehler bei der Kompilierung fangen:

foo(new Date()); 

Gibt es eine Möglichkeit, dass ich das zur Kompilierzeit abfangen kann (außer zwei getrennte Methoden zu machen public void foo(Integer x) und public void foo (String str)?

+2

überladen Sie Ihre Methode. Eine, die String und andere verwendet, die Integer benötigt. – akaHuman

+3

"* Anders als zwei getrennte Methoden *" Was ist das Problem damit? Überladen ist genau so, wie Sie Typinkonsistenzen bei der Kompilierung behandeln. Auf was genau hoffen Sie? Im Allgemeinen ist es ein schlechtes Zeichen, wenn Sie eine Methode haben, die verschiedene Arten von Eingaben akzeptiert und verschiedene Dinge mit ihnen macht. Definieren Sie stattdessen zwei separate Methoden. – dimo414

+0

Obwohl Sie dies in C++ * erreichen könnten (diese Art von Legitimierung dieser Frage IMHO) können Sie es nicht in Java tun. Jede Lösung wird auf genau zwei überladene Funktionen herunterkochen. – Bathsheba

Antwort

4

Sicher, bauen überlastet Versionen von foo:

foo(String obj)

foo(Integer obj)

und entfernen Sie die allgemeine. Lassen Sie diese einen General anrufen (private) _foo(Object obj), wenn Sie müssen.

0

Ich würde sogar noch einen Schritt weiter gehen; Sie sollten nicht nur zwei Methoden haben (eine nimmt eine Zeichenkette, eine nimmt eine ganze Zahl an) ... Sie sollten diesen Methoden zwei verschiedene Namen geben.

Sie möchten SRP folgen (Prinzip der einfachen Verantwortung). Jedes Element (Klassen, Methoden) in Ihrem Code sollte für genau "eine Sache" verantwortlich sein.

Und die Namen Ihrer Klassen und Methoden sollten deutlich machen, was sie tun sollen. Und in diesem Sinne erscheint es peinlich, dass Sie zwei Methoden mit dem gleichen Namen und verschiedenen Parametern haben. Weil diese beiden Methoden im Wesentlichen verschiedene Dinge tun würden. Also - gib ihnen Namen, die sagen, was sie wirklich tun.

+0

Sie tun wirklich im Grunde die gleiche Sache. Es gibt eine Liste von Büros auf dem Bildschirm, jeder hat eine ID. Die Methode (sie ist nicht ungültig) gibt Informationen über das Büro zurück. Wenn Sie eine Zeichenfolge übergeben, wird sie für dieses Büro zurückgegeben, und wenn Sie eine Ganzzahl übergeben, wird das + 1 sein (dh wenn die Büros in der Reihenfolge "111112", "231222", "123456" sind und Sie 0 übergeben) wird die Information für "111112" erhalten, eine 1 weitergeben und die Information für "231222" zurückgeben usw. – Tony

+0

Ich habe mich oft gefragt, warum es notwendig ist, den gleichen Namen für zwei Methoden mit unterschiedlichen Parametern zu haben beschreibender Name. – Tony

0

Es wird kein Fehler festgestellt, da kein Fehler vorliegt.
Sie lassen zu, dass ein Objekt als Argument übergeben wird. Wie Sie wissen, basieren alle Objekte auf der Klasse Object. Daher ist new Date() eine Instanz von Object.
Ich würde empfehlen, die beiden Methoden zu erstellen, da dies den Code sauberer halten würde.

Verwandte Themen