Подтвердить что ты не робот

Что такое эквивалент Java для создания анонимного объекта в С#?

В С# вы можете сделать следующее:

var objResult = new { success = result };

Есть ли эквивалент java для этого?

4b9b3361

Ответ 1

Java не имеет вывода типа, предоставленного С# ключевым словом var, поэтому, пока вы можете создавать анонимные типы, они не очень хороши, поскольку вы не можете получить их атрибуты.

Итак, вы можете создать экземпляр анонимного класса следующим образом:

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

Но так как myobj является экземпляром Object, вы не можете получить доступ к success в своем коде, и, поскольку вы создали экземпляр анонимного класса, по определению нет способа явно ссылаться на этот класс.

В С# var решает это, вызывая тип, но в Java нет способа сделать это.

Обычно анонимные классы используются для создания реализаций интерфейсов и абстрактных классов и поэтому ссылаются на использование интерфейса или родительского класса в качестве типа.

Ответ 2

Вы можете определенно записать эквивалент как

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

В этом случае вы создаете встроенный анонимный подкласс Object, который содержит поле success, созданное для значения result (которое, как я предполагал, является логическим здесь, но может быть чем угодно).

Однако это не очень полезно - поскольку Java строго типизирован, и вы не можете ссылаться на анонимный класс, который вы создали, вы не сможете ссылаться на переменную success в любом месте. Анонимные подклассы обычно используются либо для реализации интерфейсов одного метода, либо, возможно, для переопределения метода суперкласса - оба этих случая более полезны, поскольку другой код может вызывать переопределенное поведение с помощью метода, объявленного в родительском классе/интерфейсе.

Таким образом, анонимный подкласс Object, который может быть полезен, может быть примерно следующим:

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

Это поведение теперь отображается, поскольку вы можете вызвать objResult.toString(), чтобы получить строковый результат.

На практике лучше было бы определить интерфейс с помощью метода getResult(), а затем реализовать его либо с конкретным, либо с анонимным классом.

Ответ 3

Вам просто сложно получить информацию снова:

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

Чтобы получить поля, вы должны использовать отражение:

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

Для разных типов поля success для значения вам понадобятся разные геттеры.

Ответ 4

Существует аналогичная, но не идентичная функциональность в виде анонимных классов. Разница заключается в том, что они должны реализовать определенный именованный интерфейс или расширить именованный класс.

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

Ответ 5

Java не имеет эквивалентной функции для неявного определения типов с реализацией возвращаемых значений. Я предполагаю, что наиболее близким эквивалентным кодом будет определение интерфейса методов "get" вместе с ручной реализацией.

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

Вероятно, вам лучше взять более похожий на Java подход к конкретной проблеме. Анонимные объекты С# и анонимные классы Java похожи по имени, но не функциональны.