2011-12-13 9 views
16

En C#, se puede hacer lo siguiente:¿Cuál es el equivalente Java de crear un objeto anónimo en C#?

var objResult = new { success = result };

¿Hay un equivalente Java para esto?

+0

¿Qué es 'success', y cuál es' result'? – belgther

+1

éxito sería el nombre del campo, el resultado es un objeto arbitrario, resuelto al tipo actual de la variable de resultado. Si fuera 'int result = 3;' 'var obj = new {success = result};' obj sería una clase con un campo: int success – Bas

+0

Correcto. En mi caso, 'success' es un' Boolean' y 'result' era' true' o 'false'. – Cody

Respuesta

19

Java no tiene la inferencia de tipo proporcionada a C# por la palabra clave var, por lo que aunque puede crear tipos anónimos, no son muy buenos ya que no puede obtener sus atributos.

para que pueda crear una instancia de una clase anónima, así:

Object myobj = new Object() { 
    public final boolean success = true; 
} 

Pero desde myobj es una instancia de Object no puede acceder a success en su código, y como se ha creado una instancia de una clase anónima por definición no hay forma de referirse explícitamente a esta clase.

En C# var resuelve esto al inferir el tipo, pero no hay forma de hacerlo en Java.

Las clases normalmente anónimas se utilizan para crear implementaciones de interfaces y clases abstractas, por lo que se hace referencia a ellas utilizando la interfaz o la clase principal como tipo.

+3

Para leer esto, es una locura que necesite crear un archivo de clase solo para una clase/tipo simple con algunas propiedades para ampliar la legibilidad. Yikes. – Codebeat

+0

Sí, no estoy muy contento de haber sido trasladado de proyectos .Net a Java ... Esto es una locura –

1

Hay una funcionalidad similar pero no idéntica en forma de clases anónimas. La diferencia es que tienen que implementar una interfaz con nombre particular o extender una clase con nombre.

SomeInterface obj = new SomeInterface() { 
    // implement the interface 
} 

Así, para aproximar su ejemplo:

interface Result 
{ 
    bool getSuccess(); 
} 

// ... 

bool result = DoSomething(); 
Result objResult = new Result() { 
    bool getSuccess() { return result; } 
} 

Pero no hay mucha ganancia para este ejemplo.

http://www.docstore.mik.ua/orelly/java-ent/jnut/ch03_12.htm

+0

No son realmente características similares, aparte del nombre. –

+0

No es anónimo en absoluto. – CKuck

+0

Bueno, la clase es anónima. La interfaz no es. – CodesInChaos

8

Definitivamente, usted puede escribir el equivalente

Object objResult = new Object() { 
    boolean success = result; 
} 

Lo que has hecho en este caso es crear una subclase anónima línea de Object, que contiene un campo success instancia al valor de result (que supongo que es un booleano aquí, pero podría ser cualquier cosa).

Sin embargo, esto no es muy útil, ya que Java está fuertemente tipada, y no tiene forma de referirse a la clase anónima que creó, no podrá consultar la variable success en ninguna parte. Generalmente, las subclases anónimas se utilizan para implementar interfaces de método único o quizás para anular un método de superclase; ambos casos son más útiles ya que otro código puede invocar el comportamiento anulado mediante el método declarado en la clase/interfaz principal.

lo tanto, una subclase anónima de objeto que podría ser útil podría ser algo como lo siguiente:

Object objresult = new Object() { 
    @Override public String toString() { 
     return result.toString(); 
    } 
} 

Este comportamiento se expone ahora como se puede llamar objResult.toString() con el fin de obtener el resultado stringified a cabo.

En la práctica, sería mejor definir una interfaz con un método getResult() en su lugar, y luego implementar esto con una clase concreta o anónima.

+0

Sí, lo descubrí por el camino difícil. Sin embargo, no estoy seguro de lo bueno que sería, como dijiste. - Acabo de ver tu edición. – Cody

8

Sólo tienen más dificultades para obtener la información de nuevo:

Object objResult = new Object(){ public final boolean success = result; }; 

Para obtener los campos que tienen que utilizar la reflexión:

objResult.getClass().getDeclaredField("success").getBoolean(objResult) 

Para los diferentes tipos del campo success necesitará diferentes getters para el valor.

+0

La clase anónima creada tiene visibilidad del paquete. ¿Cómo se hace esto en un paquete que no es el que creó esta clase anónima? –

0

Java no tiene una función equivalente para definir tipos implícitamente implementados mediante la devolución de valores. Supongo que el código equivalente más cercano sería definir una interfaz de métodos "get" junto con una implementación hecha a mano.

interface Result { 
    boolean success(); 
} 
Result objResult = new Result() { 
    public boolean success() { return result; } 
}; 

Probablemente sea mejor que adopte un enfoque más similar al de Java para el problema específico. Los objetos anónimos de C# y las clases anónimas de Java son similares en nombre, pero no en funcionalidad.

Cuestiones relacionadas