Терминал Java без назначения
Есть ли способ сделать тройную операцию java, не выполняя задание или способ подделать assingment?
Мне нравится, как выглядит краткий трехмерный код, когда вы делаете кучу if/then/elses.
Я надеюсь, что вы сможете вызвать одну из двух функций void на основе оператора булевой алгебры.
Что-то вроде:
(bool1 && bool2) ? voidFunc1() : voidFunc2();
Мои функции имеют тип возврата void
, поэтому, если есть способ подделать это в задании, чтобы заставить его работать, тогда я с этим согласен... Я хотел бы видеть, как это сделать, хотя:)
Ответы
Ответ 1
Нет, вы не можете этого сделать. Спецификация говорит об этом.
Условный оператор имеет три выражения операнда.? появляется между первым и вторым выражениями, и: появляется между второе и третье выражения.
Первое выражение должно иметь тип boolean или Boolean, или ошибка времени компиляции.
Это ошибка времени компиляции для второго или третьего операндавыражение является вызовом метода void.
[EDIT]
Так как вы спрашивали об рефлексии, вот решение. Я не рекомендую это. Я отправляю его только потому, что вы спросили.
public class MyCall
{
public void a(){System.out.println("a");}
public void b(){System.out.println("b");}
public static void main(String... args)
{
new MyCall().go();
}
public void go()
{
Class<? extends MyCall> class1 = this.getClass();
Method aMethod = class1.getMethod("b", null);
Method bMethod = class1.getMethod("a", null);
Object fake = false ? aMethod.invoke(this, null) : bMethod.invoke(this, null);
Object fake2 = true ? aMethod.invoke(this, null) : bMethod.invoke(this, null);
}
}
В конце дня вы должны спросить себя, будет ли сукцинт улучшать читаемость кода (подумайте о каждом цикле). Ни одно из этих решений не улучшает читаемость кода IMHO. Если бы я был вами, я бы лучше пошел с этим.
if(condition)
a();
else
b();
Я на самом деле для, включая фигурные скобки, даже если петли содержат только одну строку, но поскольку вы идете после четкого кода, фрагмент выше должен делать.
Ответ 2
Нет, вы не можете сделать это вот так.
Вы можете предпочесть этот стиль, если не нравится делать его более выраженным.
if(bool1 && bool2) voidFunc1(); else voidFunc2();
В тройном операторе Операнды должны быть непустыми выражениями; то есть они должны производить некоторую фактическую величину.
Ответ 3
Если вы действительно действительно хотите использовать ternany, то есть один взлом.
НО это очень плохой код, предназначенный только для отображения способностей языка.
Я бы никогда не рекомендовал поставить этот код в производство или даже показать своим друзьям.
int dummy = (bool1 && bool2) ? new Object(){
public int hashCode() {
yourFunction1();
// ...
yourFunctionN();
return 0;
};
}.hashCode() : new Object(){
public int hashCode() {
yourAnotherFunction1();
// ...
yourAnotherFunctionN();
return 0;
};
}.hashCode();
Ответ 4
Есть ли способ сделать тройную операцию java без выполнения задания или способа подделать назначение?
ОК, поэтому, когда вы пишете такой оператор:
(bool1 && bool2) ? voidFunc1() : voidFunc2();
есть две различные проблемы с кодом:
-
2-й и 3-й операнды условного выражения 1 не могут быть вызовами методов void. Ссылка: JLS 15.25.
-
Выражение не является выражением, если оно не является и выражением присваивания, либо вызовом метода ИЛИ созданием объекта. Ссылка: JLS 14.8.
Фактически, вторая из этих проблем - синтаксическая ошибка, и я ожидал бы, что любые компиляторы Java основного уровня сообщают об этом вместо первой проблемы. Первая проблема будет раскрываться только в том случае, если вы сделали что-то вроде этого:
SomeType dummy = (bool1 && bool2) ? voidFunc1() : voidFunc2();
или
gobble((bool1 && bool2) ? voidFunc1() : voidFunc2());
где gobble
- метод, который ничего не делает... кроме "потребляет" значение его аргумента.
AFAIK, нет контекста, в котором исходное выражение приемлемо.
1 - "Условное выражение" является основным термином, используемым для этой конструкции в Спецификации языка Java. Он называется "тернарный условный оператор" в учебнике Oracle Java.
Ответ 5
Вы можете попробовать
dummyType dummy = (bool1 && bool2) ? dummyTypeReturnFunc1() : dummyTypeReturn2();
Но разве это понятно? - Нет.