Кастом или операция в Java - PullRequest
1 голос
/ 20 сентября 2019

Для проекта в Java я создаю собственный логический класс (с именем Result), который может иметь три значения: True, False или Undefined.Я определил две функции: «или» и «и» с правилами:

    public static Result or(Result r1, Result r2) {
        if(r1.isTrue() || r2.isTrue()){
            return V(); //new Result with value "True";
        } else if(r1.isUndefined() || r2.isUndefined()) {
            return U(); //new Result with value "Undefined";
        }  else {
            return F(); //new Result with value "False";
        }
    }

    public static Result and(Result r1, Result r2) {
        if(r1.isFalse() || r2.isFalse()){
            return F(); //new Result with value "False";
        } else if(r1.isUndefined() || r2.isUndefined()) {
            return U();//new Result with value "Undefined";
        }  else {
            return V(); //new Result with value "True";
        }
    }

Это работает, но во многих случаях это неэффективно, потому что мне нужно вычислить значение двух Результатов до вычисления возвратаиз «или» или «и»:

, если я сделаю

if(f1() || f2()){

}

и результат f1 () равен True, то f2 () никогда не будет выполнен, чтобы сэкономить время вычислений.

Есть ли решение для такого же поведения с моим пользовательским классом?

1 Ответ

2 голосов
/ 20 сентября 2019

Вы можете использовать Supplier, чтобы получить «отсроченное» выполнение вашего Result класса:

public static Result or(Supplier<Result> r1Supplier, Supplier<Result> r2Supplier) {
        Result r1 = r1Supplier.get();
        if(r1.isTrue()){
            return V(); //new Result with value "True";
        } else if(r1.isUndefined()) {
            return U(); //new Result with value "Undefined";
        }  else {
            // only here you need to handle r2 
            Result r2 = r2Supplier.get();
            if(r2.isTrue()){
                return V(); //new Result with value "True";
            } else if(r2.isUndefined()) {
                return U(); //new Result with value "Undefined";
            }  else {
                return F();
            }
        }
    }

Его можно немного почистить и упорядочить лучше, но вы получите зависаниеиз этого

...