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


En C#, vous pouvez faire ce qui suit:

var objResult = new { success = result };

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

Author: Cody, 2011-12-13

6 answers

Java n'a pas d'inférence de type fournie à C# par le mot-clé var, donc bien que vous puissiez créer des types anonymes, ils ne sont pas très bons car vous ne pouvez pas obtenir leurs attributs.

Vous pouvez donc créer une instance d'une classe anonyme comme ceci:

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

Mais puisque myobj est une instance de Object vous ne pouvez pas accéder à successdans votre code, et comme vous avez créé une instance d'une classe anonyme, il n'y a par définition aucun moyen de se référer explicitement à cette classe.

Dans C # var résout cela en déduisant le type mais il n'y a aucun moyen de le faire en Java.

Les classes normalement anonymes sont utilisées pour créer des implémentations d'interfaces et de classes abstraites et sont donc référencées en utilisant l'interface ou la classe parent comme type.

 21
Author: Dave Webb, 2011-12-13 12:20:50

, Vous pouvez certainement écrire l'équivalent

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

Ce que vous avez fait dans ce cas est de créer une sous-classe anonyme en ligne de Object, qui contient un champ success instancié à la valeur de result (que j'ai supposé être un booléen ici, mais pourrait être n'importe quoi).

Cependant, ce n'est pas très utile - puisque 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 pas faire référence à la variable success n'importe où. Les sous-classes anonymes sont généralement utilisé pour implémenter des interfaces à méthode unique, ou peut - être fournir un remplacement d'une méthode de superclasse-ces deux cas sont plus utiles car un autre code peut invoquer le comportement surchargé via la méthode déclarée sur la classe/interface parent.

Ainsi, une sous-classe anonyme d'objet qui pourrait être utile pourrait être quelque chose comme ce qui suit:

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

Ce comportement est maintenant exposé car vous pouvez appeler objResult.toString() afin d'obtenir le résultat stringifié hors.

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

 9
Author: Andrzej Doyle, 2011-12-13 12:02:36

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 réflexion:

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

Pour les différents types de champ success vous aurez besoin de différentes méthodes pour la valeur.

 8
Author: CKuck, 2013-04-23 08:52:45

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 flux:

var names = List.of("John", "Peter", "Olaf");

var namesAndLength = names.stream().map(n -> new Object() {
    String 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

 2
Author: dusky, 2018-07-06 12:52:35

Il existe des fonctionnalités similaires mais pas identiques sous la forme de classes anonymes. La différence étant 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 approximer 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

 1
Author: Paul Ruane, 2011-12-13 12:06:43

Java n'a pas de fonctionnalité équivalente pour définir implicitement des types avec implémentés en renvoyant des valeurs. Je suppose que le code équivalent le plus proche serait de définir une interface de méthodes "get" avec une implémentation faite à la main.

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

Vous feriez probablement mieux d'adopter une approche plus Java du problème spécifique. Les objets anonymes C# et les classes anonymes Java ont un nom similaire, mais pas de fonctionnalité.

 1
Author: Tom Hawtin - tackline, 2011-12-13 12:18:31