Ist Überlastung wirklich die einzige Möglichkeit, Standardwerte für Methodenparameter in Java zu bekommen?

StackOverflow https://stackoverflow.com/questions/618276

  •  03-07-2019
  •  | 
  •  

Frage

Ich bin ganz neu in Java und Python und PHP, ich bin auf den Standardwert für die Funktionsparameter verwendet.

Also ich habe eine Gewohnheit des Schreibens Methoden, die aus leicht unterschiedlichen Situationen genannt sind so konzipiert werden, in denen Sie nur einige der Werte festlegen möchten. Zum Beispiel in meinem PHP-Code, würde dies gemeinsam sein, wo ich Factory-Methoden habe, die Objektinstanzen mit leicht unterschiedlichen Eigenschaften zur Verfügung stellen.

In Java, wie es scheint, ich habe eine Methode haben, die alle Parameter erwartet und dann mehrere überladene Variationen, die diese Methode mit einigen der Parameter auf die Standardwerte und einige, die von dem Anrufer nennen würde. Das ist gut, OK, aber kann manchmal auf die Nerven bekommen.

Ich erinnere mich, dass dies ärgert mich schon in einigen kurzen Ausflügen in C ++ und Actionscript. Nun tun erfahrene Java-Entwickler für diese eine Abkürzung haben?

Es scheint mir, dass, technisch gesehen, ist die Frage durch die Summe aller Beiträge als beantwortet „Ja, es ist“. Ich habe einen Wiki Beitrag unten geöffnet, um die verschiedenen alternativen Lösungen zu sammeln, bitte beitragen, wenn Sie möchten. Ich fand alle diese sehr hilfreich als Inspiration und als Beispiele für typische Java-Konstrukte zu lernen.

War es hilfreich?

Lösung 6

Es scheint, wie: "Ja, es ist", mit der Ausnahme:

ähnliche Effekte mit erreicht werden könnten varargs wie vorgeschlagen von Paul Whelan oder durch eine zusätzliche Art der Festlegung der Parameter als Felder mit den richtigen Standardwerte tragen wie von Jon Skeet vorgeschlagen. Boris Pavlovic fügt hinzu, dass seine Art könnte eine innere statische Klasse sein, die Dinge zu halten, ordentlich an der richtigen Stelle.

Cons (Beachten Sie, dass diese ganze Frage ist nicht über keine ernsthaften Auswirkungen, nur um bequem zwickt):

varargs scheint am besten geeignet für eine Liste mit variabler Länge von Werten vorbei, die sehr ähnliche Form und meist gleichwertige Bedeutung hat, wie zum Beispiel einer Liste von Namen haben. Wenn für den Zweck in der Frage angegeben verwendet wird, würde das Verfahren muß verschiedene Prüfungen auf der Liste durchführt, um sie zu interpretieren, was nicht mehr scheint, aber weniger bequem.

Eine besondere Art der Parameter tragen scheint am nützlichsten, wenn die sich ergebende Art der andere Verwendungen sein könnte, als nur auf eine bestimmte Methode übergeben wird, oder wenn es sich um eine komplexere Reihe von Parametern. Wenn es 2-4 Parameter ist und einige Standardwerte haben, so scheint es immer noch ein wenig bequemer zu Überlastung, aber das ist vielleicht eine Frage des persönlichen Geschmacks.

Andere Tipps

Eine weitere Möglichkeit ist eine Variante des Builder-Muster - Sie haben eine Art, die alle Parameter darstellt, konstruieren eine Instanz dieses Typs (die Standardwerte entsprechend), stellen Sie die gewünschten Eigenschaften, und dann das Ergebnis in die ursprüngliche Methode übergeben oder ein Verfahren, in dem „Parametertyp“ hinzufügen, damit Sie die Methode aufrufen.

Sie können dies in Aktion in den Standardbibliotheken sehen, die mit dem ProcessBuilder und Process Klassen.

siehe varargs

http : //www.java-tips.org/java-se-tips/java.lang/using-the-varargs-language-feature.html

(Aktualisiert URL; dieser Kommentar hinzugefügt, da erfordert Stackoverflow> 30 Zeichen)

Um diesen einfacher zu machen, habe ich eine Anmerkung für Standardwerte und einen Annotation-Prozessor, der eine übergeordnete Klasse mit den überladenen Methoden erzeugt. Zum Beispiel:

protected void process(
    Processor processor,
    String item,
    @Default("Processor.Size.LARGE") Size size,
    @Default("red") String color,
    @Default("1") int quantity) {
        ...
}

, die (in einer übergeordneten Klasse erzeugt) erzeugt

protected void process(sample.Processor processor, java.lang.String item)  {
    process(processor, item, Processor.Size.LARGE, "red", 1);
}
protected void process(sample.Processor processor, 
                       java.lang.String item, 
                       sample.Processor.Size size)  {
    process(processor, item, size, "red", 1);
}
protected void process(sample.Processor processor, 
                       java.lang.String item, 
                       sample.Processor.Size size, 
                       java.lang.String color)  {
    process(processor, item, size, color, 1);
}
protected abstract void process(sample.Processor processor, 
                                java.lang.String item, 
                                sample.Processor.Size size, 
                                java.lang.String color, 
                                int quantity) ;

Siehe http://code.google.com/p/javadude/wiki/ Anmerkungen - Scott

Es kann sehr schwierig sein, zu versuchen, Ihren obwohl Prozess von einem Langauge in einer anderen zu übersetzen. Sie können, wie andere haben darauf hingewiesen, einige Workarounds vielleicht bekommen, was Sie wollen ... aber je früher Sie „akzeptieren“, um die Art und Weise, dass Java ist so konzipiert, desto besser Sie werden arbeiten, wenn in Java arbeiten.

Ich hatte einige PHP Sachen zu tun ... mich gestört zu keinem Ende, dass ich es nicht tun bekommen konnte, was ich wollte ... so geht es in beiden Richtungen.

Das größte Hindernis Sie über den Weg laufen werden, ist wahrscheinlich die statische Typisierung. Es gibt Dinge, die Sie versuchen können, zu tun um ihn zu arbeiten, aber am Ende werden sie ein sehr großer Hack.

In den frühen Tagen von C ++ Menschen versucht, C ++ zu überzeugen, wie Smalltalk zu verhalten ... funktionierte nicht allzu gut aus. In den frühen Tagen, wenn Java Menschen versuchten, ihre C ++ Kenntnisse zu nehmen und es in Java verwenden ... haben zu gut nicht funktioniert (was doppelt frustrierend ist, wie die Sprachen auf der Oberfläche sehr ähnlich sind).

Mein Rat für Ihre Java-Codierung lernen, wie ein Java-Entwickler zu programmieren eher als ein PHP-Entwickler.

Für Ihr unmittelbares Problem ist es möglich, dass Sie sollten wirklich Differnt Klassen aus der Fabrik werden Neuabstimmung statt die gleiche Art von Objekt erstellen mit differnt Variablen gesetzt?

Solange Sie Code in einer OO-Weise Sie keine Standardwerte in Java verpassen. Standardargumente sind praktisch nur in prozeduralen Programmierstil.

In OO statt den Staat durch die Methoden / Verfahren vorbei ist der Staat bereits in dem Objekt Sie anrufen, oder die Objekte, die Sie als Parameter übergeben. Die meisten der Zeit, die Sie brauchen nicht mehr als 1 oder 2 Parameter in Ihren Methoden.

Wenn Sie Sie das Objekt konfigurieren möchten, bevor Sie es, würden Sie es mit einem einfachen Konstruktor konstruieren und als verschiedene Setter nennen. Dies macht den Code viel besser lesbar (weil Sie den Setter-Namen sehen), im Vergleich zu einem Konstruktor mit vielen Argumenten aufgerufen wird. Und im Fall ein neues Attribut später kommt, können Sie zu Ihrem Objekt hinzugefügt, ohne Ihre bestehende Fabrik Methoden zu ändern.

Ja von oop ist seine die Überlastung, die für die Verwendung von Standard-Paramater in Java ist der einzige Weg. Aber hier ist der Hack für Sie. Wenn Sie eine Überlastung und Sie mögen Standardparameter haben. Dann werden Sie am Ende

public void methodA(A arg1) { }
public void methodA( B arg2,) { }
public void methodA(C arg3) { }
public void methodA(A arg1, B arg2) { }
public void methodA(A arg1, C arg3) { }
public void methodA( B arg2, C arg3) { }
public void methodA(A arg1, B arg2, C arg3) { }

Aber durch varargs mit

public class DefaultValue
{
 public static void main(String[] args)
  {
       defaultParameter();
       defaultParameter(true);
  }

  public static void defaultParameter(Boolean …gender)
  {
       boolean genderBoolean = false; // It is the default value you want to give
       if(1 == gender.length)
       {
            genderBoolean = gender[0]; // Overrided Value
      }
       System.out.println(genderBoolean);
 }
}

Der obige Code ausgegeben wird

false
true

Weitere simliar Beispiele und Erklärungen Besuch java-default-Parameter-Werte

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top