在c#中创建匿名对象的Java等价物是什么?

本文关键字:Java 等价物 是什么 对象 创建 | 更新日期: 2023-09-27 18:17:46

在c#中,您可以做以下操作:

var objResult = new { success = result };

是否有一个java等价的?

在c#中创建匿名对象的Java等价物是什么?

Java没有通过var关键字为c#提供类型推断,因此尽管您可以创建匿名类型,但由于无法获得其属性,因此它们不是很好。

所以你可以像这样创建一个匿名类的实例:

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

但是因为myobjObject的一个实例,你不能在你的代码中访问success,因为你已经创建了一个匿名类的实例,根据定义没有办法显式地引用这个类。

在c#中,var通过推断类型来解决这个问题,但在Java中没有办法做到这一点。

通常匿名类用于创建接口和抽象类的实现,因此使用接口或父类作为类型引用。

在Java 10中可以使用匿名类:

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

你可以在流中使用它们:

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

您可以将等效的内容写成

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

在这种情况下,您所做的是创建Object的内联匿名子类,它包含一个实例化为result值的success字段(我假设这里是布尔值,但可以是任何值)。

然而,这不是很有用——因为Java是强类型的,并且您无法引用您创建的匿名类,因此您将无法在任何地方引用success变量。匿名子类通常用于实现单方法接口,或者可能提供超类方法的重写——这两种情况都更有用,因为其他代码可以通过在父类/接口上声明的方法调用被重写的行为。

所以Object的一个匿名子类可能是有用的可以是下面这样的:

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

这个行为现在暴露了,因为你可以调用objResult.toString()来获得字符串化的结果。

在实践中,最好用getResult()方法定义一个接口,然后用一个具体的或匿名的类来实现它。

你只是有一个更困难的时间来获得信息:

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

要获取字段,必须使用反射:

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

对于不同类型的success字段,您将需要不同的值getter。

以匿名类的形式存在类似但不完全相同的功能。不同之处在于它们必须实现特定的命名接口或扩展命名类。

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

所以,近似你的例子:

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

但是这个例子并没有什么好处。

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

Java没有通过返回值实现的隐式定义类型的等效特性。我想最接近等价的代码应该是定义一个"get"方法的接口和一个手工实现。

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

对于特定的问题,您可能最好采用更类似java的方法。c#匿名对象和Java匿名类在名称上相似,但在功能上不同。