В С# вы можете сделать следующее:
var objResult = new { success = result };
Есть ли эквивалент java для этого?
В С# вы можете сделать следующее:
var objResult = new { success = result };
Есть ли эквивалент java для этого?
Java не имеет вывода типа, предоставленного С# ключевым словом var
, поэтому, пока вы можете создавать анонимные типы, они не очень хороши, поскольку вы не можете получить их атрибуты.
Итак, вы можете создать экземпляр анонимного класса следующим образом:
Object myobj = new Object() {
public final boolean success = true;
}
Но так как myobj
является экземпляром Object
, вы не можете получить доступ к success
в своем коде, и, поскольку вы создали экземпляр анонимного класса, по определению нет способа явно ссылаться на этот класс.
В С# var
решает это, вызывая тип, но в Java нет способа сделать это.
Обычно анонимные классы используются для создания реализаций интерфейсов и абстрактных классов и поэтому ссылаются на использование интерфейса или родительского класса в качестве типа.
Вы можете определенно записать эквивалент как
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()
, а затем реализовать его либо с конкретным, либо с анонимным классом.
Вам просто сложно получить информацию снова:
Object objResult = new Object(){ public final boolean success = result; };
Чтобы получить поля, вы должны использовать отражение:
objResult.getClass().getDeclaredField("success").getBoolean(objResult)
Для разных типов поля success
для значения вам понадобятся разные геттеры.
Существует аналогичная, но не идентичная функциональность в виде анонимных классов. Разница заключается в том, что они должны реализовать определенный именованный интерфейс или расширить именованный класс.
SomeInterface obj = new SomeInterface() {
// implement the interface
}
Итак, чтобы приблизиться к вашему примеру:
interface Result
{
bool getSuccess();
}
// ...
bool result = DoSomething();
Result objResult = new Result() {
bool getSuccess() { return result; }
}
Но для этого примера нет большого выигрыша.
Java не имеет эквивалентной функции для неявного определения типов с реализацией возвращаемых значений. Я предполагаю, что наиболее близким эквивалентным кодом будет определение интерфейса методов "get" вместе с ручной реализацией.
interface Result {
boolean success();
}
Result objResult = new Result() {
public boolean success() { return result; }
};
Вероятно, вам лучше взять более похожий на Java подход к конкретной проблеме. Анонимные объекты С# и анонимные классы Java похожи по имени, но не функциональны.