2010-11-26 10 views
17

Ich habe mich umgesehen, um zu versuchen, die Gründe dafür zu finden, Standardparameter für Funktionen in Java nicht zu berücksichtigen.Technischer Grund für keine Standardparameter in Java

Ich bin mir bewusst, dass es möglich ist, das Verhalten zu simulieren, entweder mit varargs oder durch mehrere überladene Funktionen, die weniger Parameter akzeptieren, und rufen Sie die echte Funktion auf, die alle Parameter übernimmt. Keine dieser Optionen entspricht jedoch der Klarheit und Benutzerfreundlichkeit von z. C++ - Syntax.

Wer weiß, wenn es einen soliden technischen Grund, die so etwas wie

void myFunc(int a=1, int b=2) {...} 

unerwünscht oder rückgängig gemacht werden-können in einer neuen Version von Java machen würde?

+1

@Srinivas also die Sprache, die Sie verwenden –

+0

@ S.P. haha ...... –

+0

Wie bei vielen Dingen in Java, ist die Lösung, IntelliJ zu verwenden :) Javas inhärente Klunkheit und Klarheit machen es zu einem idealen Kandidaten für IDEs. – Alex

Antwort

4

Ich kenne keinen technischen Grund, abgesehen davon, dass es kompliziert ist, welche Werte weggelassen werden und welche nicht.

Zum Beispiel, in Ihrer Probe, wenn nur eine ganze Zahl durchgereicht wurde, dann ist es a oder b, die sollte voreingestellt werden? Höchstwahrscheinlich a, aber es fügt diese Ebene der Ambiguität hinzu.

wäre eine einfache Lösung für

void myFunc(Integer a, Integer b) { 
    if (a == null) a = 1; 
    if (b == null) b = 2; 

} 

sein Ja es langatmig ist, und ja, es versteckt sich im Code der säumige, anstatt die Methode Signatur (die dann in JavaDoc gezeigt werden konnte), aber es erzwingt die Konsistenz.

+12

Ich stimme nicht zu. In C++ gibt es keine Mehrdeutigkeit - obwohl es um den Preis von etwas begrenzt in welchen Parametern Sie spezifizieren können (d. H. Sie können nicht die erste Standard und geben Sie einen Wert für die Sekunde). Dies ist jedoch ein kleines Problem, wenn Sie eine IDE wie Eclipse haben, die Ihnen die Signatur der Methode sagt. FlexBuilder macht das ganz gut ... – Kricket

+0

Zusätzlich zu Kelseys Punkt ist es ein Vorteil des Default-Parameters, den Methodenaufruf prägnanter zu machen. Ihre Lösung für den Standardwert hat diesen Vorteil nicht. – Nicolas

3

Es war nicht in der ersten Version von Java, weil sie entschieden, dass sie es nicht brauchten, wahrscheinlich um die Dinge einfach zu halten.

Es wäre jetzt schwierig, es hinzuzufügen, weil es rückwärtskompatibel ausgeführt werden muss. Das Hinzufügen von Varargs, Autoboxing und Generics in Java5 war ein großes Unterfangen und konnte nur mit eingeschränkter Funktionalität (wie z. B. Löschen von Daten) und auf Kosten erhöhter Komplexität durchgeführt werden (die neuen Methodenauflösungsregeln sorgen für gute Testtrickfragen).

Ihre beste Aufnahme wäre mit einer nicht-Java-Sprache auf der JVM. Vielleicht hat einer von ihnen das schon.

+2

Groovy hat Standard-Argumentwerte: http://groovy.codehaus.org/Extended+Guide+to+Method+Signatures#ExtendedGuidetoMethodSignatures-ArgumentswithDefaultValues ​​ –

+1

Also im Grunde sagen Sie, dass es wirklich schwer ist und so mehr Ärger als es ist wert? – Kricket

1

Ich stimme zu, dass optionale Argumente riesige Klarheit hinzufügen und die riesige Arbeit der Definition von Lasten überladener Methoden (genannt telescoping) speichern, die nichts anderes tun, als sich gegenseitig anzurufen. Der Freigeber für dieses nette Feature ist jedoch .

Die benannte Assoziation ist selbstdokumentierend. Im Gegensatz dazu ist die Zuordnung von Positionsargumenten übersichtlich, aber Sie müssen immer auf die Definition der Methode verweisen, um zu überprüfen, welches Argument bei jedem Aufruf in der Position n erwartet wird. Das ist lächerlich und motiviert uns, nach Lösungen wie Builder pattern zu suchen. Der Builder löst tatsächlich beide Probleme gleichzeitig, da die genannte Assoziation ein Synonym für optionale Argumente ist. Aber Builder ist nur für Benutzer nützlich. Der API-Designer muss weiterhin Speicherplatz/Zeit für die Erstellung der Builder-Klasse verschwenden. Musterfanatiker mögen dem widersprechen, aber es ist ein Overkill, eine Builder-Klasse für jede Methode mit benannten/optionalen Argumenten zu erstellen. Sprachdesign sollte dieses dumme Muster umgehen. Aber ich weiß nicht, wie sie mit der Variablenargumentliste kompatibel sind.

+0

Sicher, es gibt Work-arounds, aber was ich suche ist, warum die Sprachdesigner diese nützliche und einfach scheinende Funktionalität auslassen. – Kricket

+0

Es könnte eine reine Unterlassung ohne Grund sein. Manchmal haben Sie nur Aufgaben mit höherer Priorität und lassen weniger wichtige Dinge aus. Die Tatsache, dass sie sich nicht bemüht haben, ein Feature zu implementieren, argumentiert dafür. Vergleichen Sie dies mit der Irritation, dass "super" die erste Aussage im Konstruktor sein muss. Hier unternahmen sie ernsthafte Anstrengungen, um eine saubere Codierung zu verhindern. Das macht mich wütend und bittet um die ernste Frage, da normale Menschen sich nicht darum bemühen, Schaden anzurichten. – Val

+0

OK, aber Sie spekulieren - haben Sie eine Quelle, um Ihren Anspruch zu sichern? – Kricket

2

Um Mehrdeutigkeit zu vermeiden. Überschreiben der Java-Support-Methode.

Wir gehen davon aus, den Code unten:

public int add(int a) { 
    // do something 
} 

public int add(int a, int b = 0) { 
    // do something 
} 

Wenn wir add(12) nennen, Können Sie mir sagen, welche Funktion aufgerufen wird?

Verwandte Themen