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

Терминал Java без назначения

Есть ли способ сделать тройную операцию java, не выполняя задание или способ подделать assingment?

Мне нравится, как выглядит краткий трехмерный код, когда вы делаете кучу if/then/elses.

Я надеюсь, что вы сможете вызвать одну из двух функций void на основе оператора булевой алгебры.

Что-то вроде:

(bool1 && bool2) ? voidFunc1() : voidFunc2();

Мои функции имеют тип возврата void, поэтому, если есть способ подделать это в задании, чтобы заставить его работать, тогда я с этим согласен... Я хотел бы видеть, как это сделать, хотя:)

4b9b3361

Ответ 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();

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