Терминал 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();

Но разве это понятно? - Нет.