Яна Троицы без Присвоения

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

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

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

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

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

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

4 ответа

Решение

Нет, ты не можешь этого сделать. В спецификации так сказано.

Условный оператор имеет три выражения операнда.? появляется между первым и вторым выражениями, а: появляется между вторым и третьим выражениями.

Первое выражение должно иметь тип boolean или Boolean, иначе произойдет ошибка времени компиляции.

Это ошибка времени компиляции, поскольку второе или третье выражение операнда является вызовом метода void.

[РЕДАКТИРОВАТЬ]

Так как вы спросили об отражении, вот решение. Я не рекомендую это. Я публикую это только потому, что вы спросили.

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();

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

Нет, ты не можешь так делать.

Вы можете предпочесть этот стиль, если не любите делать больше заявлений.

if(bool1 && bool2) voidFunc1(); else voidFunc2();

В троичном операторе операнды должны быть не пустыми выражениями; то есть они должны произвести некоторую фактическую стоимость.

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

Хорошо, поэтому, когда вы пишете заявление, как это:

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

Есть две разные проблемы с кодом:

  1. 2-й и 3-й операнды условного выражения 1 не могут быть вызовами методов void. Ссылка: JLS 15.25.

  2. Выражение не является оператором, если только оно не является и выражением присваивания, ни вызовом метода, ни созданием объекта. Ссылка: JLS 14.8.

Фактически, вторая из этих проблем - синтаксическая ошибка, и я ожидаю, что любые основные Java-компиляторы сообщат об этом вместо первой проблемы. Первая проблема проявилась бы, если бы вы сделали что-то вроде этого:

    SomeType dummy = (bool1 && bool2) ? voidFunc1() : voidFunc2();

или же

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

где gobble это метод, который ничего не делает... кроме как "потреблять" значение своего аргумента.

AFAIK, нет контекста, в котором оригинальное выражение является приемлемым.


1 - "Условное выражение" - это основной термин, используемый для этой конструкции в Спецификации языка Java. Это называется "троичный условный оператор" в Oracle Java Tutorial.

Если вы действительно-действительно хотите использовать тернанные операции, то есть один взлом. НО это очень плохой код, предназначенный только для демонстрации языковых способностей. Я бы никогда не порекомендовал поставить этот код в производство или даже показать своим друзьям.

int dummy = (bool1 && bool2) ? new Object(){
        public int hashCode() {
            yourFunction1();
            // ...
            yourFunctionN();
            return 0;
        };
    }.hashCode() : new Object(){
        public int hashCode() {
            yourAnotherFunction1();
            // ...
            yourAnotherFunctionN();
            return 0;
        };
    }.hashCode();
Другие вопросы по тегам