2015-07-13 14 views
8

voglio obbligare l'utente a compilare un parametro opzionale quando si chiama il mio costruttore:Bel modo di forzare riempimento utente varargs parametro in Java

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

Attualmente, il seguente codice è valido:

new MyClass(); 

Voglio impedirlo. Ho pensato a questo:

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 non è un'opzione, perché ho bisogno la possibilità di utilizzare virgola args separati.

Ci sono buone soluzioni per raggiungere questo obiettivo? Si prega di non dire che i parametri varargs devono essere opzionali. La domanda non è su questo.

+0

otherParams potrebbe essere nullo se qualcuno scrive'new MyClass ("a", null) ' – wero

+1

Potresti un'eccezione se il numero di argomenti ti aspetti che non ci sia? – Pherion

+3

Forse controllare [questo] (http://stackoverflow.com/questions/12751746/requiring-at-least-one-element-in-java-variable-argument-list) soluzione? – SomeJavaGuy

risposta

10

Forse il seguente, un costruttore di default in più?

/** 
* Please provide at least one parameter. 
*/ 
@Deprecated 
public MyClass() { 
    throw new IllegalStateException("Please provide at least one parameter"); 
} 
+0

@ Tom ero troppo pigro e inconsapevole che avrebbe funzionato. Ci ho pensato. –

+6

@Tom se il modificatore sarà privato, il nuovo MyClass() chiamerebbe varargs constructor -> fail – AdamSkywalker

+0

@AdamSkywalker Right ... too bad. – Tom

1

Lanciare un IllegalArgumentException se il chiamante non ha fornito un array di parametri non vuoto.

EDIT: parafrasato il testo originale come risposta

+3

Perché è molto meglio controllare tali condizioni durante la compilazione. Domande Btw -> Commento. – Tom

+0

... per il prezzo di una creazione di array temporanea. btw il commento è stato aggiunto contemporaneamente alla mia risposta – wero

+1

Questo non fornisce una risposta alla domanda. Per criticare o richiedere chiarimenti da un autore, lascia un commento sotto il loro post. – JNYRanger

6

No, non c'è altro modo per fare questo al momento della compilazione. Quello che hai trovato è il solito schema di forzare il codice client a passare almeno un parametro.

Si può leggere in questo modo:

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

e

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

Se si desidera farlo in fase di compilazione, è necessario farlo come suggerito nell'ultimo esempio di codice.

Quindi è possibile utilizzare i ApacheCommons - ArrayUtils classe:

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