2011-06-29 7 views
8

In C#, posso creare un'istanza di ogni classe personalizzata che scrivo, e passare i valori per i suoi membri, in questo modo:Esistono espressioni di creazione di oggetti in Java, simili a quelle in C#?

public class MyClass 
{ 
    public int number; 
    public string text; 
} 

var newInstance = new MyClass { number = 1, text = "some text" }; 

Questo modo di creazione degli oggetti è chiamato object creation expressions. C'è un modo per fare lo stesso in Java? Voglio passare valori per membri pubblici arbitrari di una classe.

risposta

10

No, non c'è niente direttamente simile. Il più vicino si può venire in Java (senza scrivere una classe costruttore, ecc) è quello di utilizzare un anonimo di classe e inizializzatore blocco interno, che è orribile, ma funziona:

MyClass foo = new MyClass() 
{{ 
    number = 1; 
    text = "some text"; 
}}; 

Nota le parentesi graffe doppie ... uno per indicare " questo è il contenuto della classe interna anonima "e uno per indicare il blocco di inizializzazione. I non sarebbe raccomandare questo stile, personalmente.

+0

Più uno per orribile, definisce un'altra classe, non funziona per le classi o campi finali. Ma lo uso nel codice di test in cui l'espressività può essere più importante. –

+1

d'accordo con Jon, non usarlo! – Charbel

+0

prestazioni saggia, non è davvero un grosso problema. – irreputable

0

No. Ma non trovo il seguente codice troppo prolisso

MyClass obj = new MyClass(); 
obj.number = 1; 
obj.text = "some text"; 

o il buon vecchio costruttore di chiamare troppo confusa

MyClass obj = new MyClass(1, "some text"); 

Alcuni potrebbero suggerire metodo concatenamento:

MyClass obj = new MyClass().number(1).text("some text"); 

class MyClass 
    int number 
    public MyClass number(int number){ this.number=number; return this; } 

che richiede un metodo aggiuntivo per campo. È il codice della piastra della caldaia, un IDE può aiutare qui.

Poi c'è il modello di builder, che è ancora più lavoro per l'autore dell'API.

+0

Il primo frammento di codice ci è molto più dettagliato dell'equivalente C#. Inoltre, non puoi passarlo direttamente come parametro in un metodo, devi creare un'istanza e assegnarla a una variabile. La modalità del costruttore ha un grosso svantaggio: devi implementare manualmente il costruttore in ogni classe che desideri utilizzare in questo modo. Stessa cosa per il metodo di concatenazione, anche se è ancora più difficile. – Slavo