2015-07-13 3 views
8

ich den Benutzer zwingen, wollen in einem optionalen Parameter zu füllen, wenn mein Konstruktor aufrufen:Nizza Art und Weise Benutzer füllen zu zwingen varargs Parameter in Java

public MyClass(String... params) { 
    this.params = params; 
} 

Derzeit ist der folgende Code ist gültig:

new MyClass(); 

Ich möchte es verhindern. Ich dachte an diese:

public MyClass(String param1, String... otherParams) { 
    this.params = new String[1 + otherParams.length]; 
    this.params[0] = param1; 
    // fill 1..N params from otherParams 
} 

String[] params ist keine Option, weil ich die Fähigkeit benötigen Komma getrennt args zu verwenden.

Gibt es irgendwelche schönen Lösungen, um dies zu erreichen? Bitte sagen Sie nicht, dass Varargs Parameter optional sein müssen. Die Frage ist nicht darüber.

+0

otherParams null sein könnte, wenn jemand'New MyClass („a“, null) schreibt ' – wero

+1

Könnten Sie nur eine Ausnahme aus, wenn die Anzahl der Argumente Sie erwarten, ist nicht da? – Pherion

+3

Vielleicht prüfen [http://stackoverflow.com/questions/12751746/requiring-at-least-one-element-in-java-variable-argument-list) Lösung? – SomeJavaGuy

Antwort

10

Vielleicht die folgende, einen zusätzlichen Standardkonstruktors?

+0

@Tom Ich war zu faul und wusste nicht, ob das funktionieren würde. Dachte darüber nach. –

+6

@Tom Wenn der Modifikator privat ist, würde MyClass() varargs constructor aufrufen -> fail – AdamSkywalker

+0

@AdamSkywalker Richtig ... schade. – Tom

1

Eine IllegalArgumentException auslösen, wenn der Aufrufer kein nicht leeres Parameterarray bereitgestellt hat.

EDIT: paraphrasierten den ursprünglichen Text als Antwort

+3

Weil es viel besser ist, solche Bedingungen während des Kompilierens zu überprüfen. BTW Fragen -> Kommentar. – Tom

+0

... für den Preis einer temporären Array-Erstellung. BTW der Kommentar wurde zur gleichen Zeit wie meine Antwort hinzugefügt – wero

+1

Dies bietet keine Antwort auf die Frage. Um einen Autor zu kritisieren oder um Klärung zu bitten, hinterlasse einen Kommentar unter seinem Beitrag. – JNYRanger

6

Nein, es gibt keine andere Möglichkeit, dies zu Kompilierung-Zeit zu tun. Was Sie gefunden haben, ist das übliche Muster, das den Clientcode zwingt, mindestens einen Parameter zu übergeben.

Sie können es wie folgt lesen:

// You can pass in some parameters if you want 
public MyClass(String... params) 

und

// I require one parameter, you can pass some additional if you want 
public MyClass(String param1, String... otherParams) 
1

Wenn Sie es zur Kompilierzeit tun möchten, müssen Sie es tun, wie Sie in Ihrem letzten Codebeispiel vorgeschlagen haben.

Dann können Sie die Apache Commons verwenden - ArrayUtils Klasse:

String[] allParams = ArrayUtils.add(otherParams, 0, param1); //Insert the first param at the first position of the array. 
Verwandte Themen