Quel est l'équivalent Java de la création d'un objet anonyme en C #?
En C#, vous pouvez effectuer les opérations suivantes:
var objResult = new { success = result };
Est-il un java équivalent pour cela?
source d'informationauteur Cody
Vous devez vous connecter pour publier un commentaire.
Java n'a pas de type d'inférence à condition de C# par le
var
mot-clé, de sorte que vous pouvez créer les types anonymes qu'ils ne sont pas beaucoup de bien, car vous ne pouvez pas obtenir leurs attributs.De sorte que vous pouvez créer une instance de la classe anonyme:
Mais depuis
myobj
est une instance deObject
vous ne pouvez pas accéder àsuccess
dans votre code, et que vous avez créé une instance d'un anonyme classe il n'y a par définition aucune façon à se réfèrent explicitement à cette classe.En C#
var
résout ce problème en déduire le type mais il n'y a aucun moyen de le faire en Java.Normalement anonyme de classes sont utilisées pour créer des implémentations d'interfaces et les classes abstraites et donc sont référencées à l'aide de l'interface ou classe parent que le type.
Vous pouvez certainement écrire l'équivalent
Ce que vous avez fait dans ce cas est de créer une ligne anonyme sous-classe de
Object
qui contient unsuccess
champ instancié à la valeur deresult
(que j'ai pris en charge est un booléen ici, mais pourrait être n'importe quoi).Cependant, ce n'est pas très utile puisque Java est fortement typé, et vous n'avez aucun moyen de vous référer à la classe anonyme que vous avez créé, vous ne serez pas en mesure de vous référer à la
success
variable n'importe où. Anonyme sous-classes sont généralement utilisés pour mettre en œuvre une seule méthode d'interfaces, ou peut-être fournir un remplacement d'une super-classe de la méthode de deux de ces cas sont plus utiles depuis un autre code peut invoquer le substituée comportement via la méthode déclarée sur la classe parent/interface.De manière anonyme sous-classe de l'Objet qui pourrait être utile pourrait être quelque chose comme ce qui suit:
Ce comportement est maintenant exposée comme vous pouvez appeler
objResult.toString()
afin d'obtenir le stringified résultat.Dans la pratique, il serait préférable de définir une interface avec un
getResult()
méthode au lieu de cela, puis de mettre en œuvre ce soit avec du béton ou de la classe anonyme.Vous venez d'avoir un moment plus difficile l'obtention de l'information de nouveau:
Pour obtenir les champs que vous avez à utiliser la réflexion:
Pour les différents types de champ
success
vous aurez besoin de différentes méthodes pour la valeur.Il est similaire mais pas identique les fonctionnalités sous la forme de classes anonymes. La différence étant qu'ils ont à mettre en œuvre un particulier nommé d'interface ou d'étendre une classe nommée.
Donc, pour se rapprocher de votre exemple:
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 implicitement la définition des types avec la mise en œuvre par le retour des valeurs. Je suppose que l'équivalent le plus proche de code pour définir une interface de "sortir" des méthodes avec un art de la mise en œuvre.
Vous êtes probablement mieux de prendre un plus Java-comme approche pour le problème spécifique. C# anonyme objets et Java anonyme classes sont similaires dans le nom, mais pas la fonctionnalité.
Avec Java 10, vous pouvez utiliser anonyme classes:
Vous pouvez les utiliser avec des cours d'eau:
https://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html
https://developer.oracle.com/java/jdk-10-local-variable-type-inference