Quel est l’équivalent Java de la création d’un object anonyme en C #?

En C #, vous pouvez effectuer les opérations suivantes:

var objResult = new { success = result };

Existe-t-il un équivalent Java pour cela?

Java n’a pas d’inférence de type fournie à C # par le mot clé var . Par conséquent, bien que vous puissiez créer des types anonymes, ils ne sont pas très utiles car vous ne pouvez pas obtenir leurs atsortingbuts.

Vous pouvez donc créer une instance d’une classe anonyme comme suit:

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

Mais puisque myobj est une instance de Object vous ne pouvez pas accéder à la success dans votre code, et comme vous avez créé une instance d’une classe anonyme , il est par définition impossible de faire explicitement référence à cette classe.

En C #, var résout le problème en déduisant le type, mais il n’ya aucun moyen de le faire en Java.

Normalement, les classes anonymes sont utilisées pour créer des implémentations d’interfaces et de classes abstraites. Elles sont donc référencées en utilisant l’interface ou la classe parente comme type.

Vous pouvez certainement écrire l’équivalent

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

Dans ce cas, vous avez créé une sous-classe inline anonyme d’ Object , qui contient un champ de success instancié à la valeur de result (ce que j’ai supposé être un booléen ici, mais pourrait être n’importe quoi).

Cependant, cela n’est pas très utile – étant donné que Java est fortement typé et que vous n’avez aucun moyen de faire référence à la classe anonyme que vous avez créée, vous ne pourrez faire référence à la variable de success nulle part. Les sous-classes anonymes sont généralement utilisées soit pour implémenter des interfaces à méthode unique, soit pour remplacer une méthode de superclasse. Ces deux cas sont plus utiles, car un autre code peut appeler le comportement substitué via la méthode déclarée dans la classe / interface parente.

Donc, une sous-classe anonyme d’Object qui pourrait être utile pourrait ressembler à ceci:

 Object objresult = new Object() { @Override public Ssortingng toSsortingng() { return result.toSsortingng(); } } 

Ce comportement est maintenant exposé car vous pouvez appeler objResult.toSsortingng() afin d’extraire le résultat sous forme de chaîne.

En pratique, il serait préférable de définir une interface avec une méthode getResult() place, puis de l’implémenter avec une classe concrète ou anonyme.

Vous avez juste plus de mal à récupérer les informations:

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

Pour obtenir les champs, vous devez utiliser la reflection:

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

Pour différents types de success sur le terrain, vous aurez besoin de différents accesseurs.

Avec Java 10, vous pouvez utiliser des classes anonymes:

 boolean result = true; var objResult = new Object() { boolean success = result; }; System.out.println(objResult.success); 

Vous pouvez les utiliser avec des stream:

 var names = List.of("John", "Peter", "Olaf"); var namesAndLength = names.stream().map(n -> new Object() { Ssortingng name = n; int length = n.length(); }).collect(toList()); 

https://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html

https://developer.oracle.com/java/jdk-10-local-variable-type-inference

Il existe des fonctionnalités similaires mais non identiques sous la forme de classes anonymes. La différence est qu’ils doivent implémenter une interface nommée particulière ou étendre une classe nommée.

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

Donc, pour se rapprocher de votre exemple:

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

Mais il n’y a pas beaucoup de gain pour cet exemple.

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

Java n’a pas de fonctionnalité équivalente pour définir implicitement des types avec des valeurs implémentées par retour. Je suppose que le code équivalent le plus proche serait de définir une interface de méthodes “get” avec une implémentation à la main.

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

Il vaut probablement mieux adopter une approche plus semblable à Java pour résoudre un problème spécifique. Les objects anonymes C # et les classes anonymes Java ont un nom similaire, mais pas une fonctionnalité.