2016-11-24 2 views
0

У меня есть класс с 2-состояниями, которые определяются значением атрибута (например, начало, которое может быть верным ложным)Java постоянного переключатель

Когда я вызываю метод из экземпляра я хочу получить другое поведение в зависимости от состояния. В настоящее время я использую оператор if, который будет запрашивать состояние при каждом вызове метода, но я думаю, что может быть более быстрый способ сделать это (возможно, что-то вроде полиморфизма?)

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

фиктивный пример ниже (моя фактическая проблема гораздо больше времени и, следовательно, необходимость улучшения)

public class StateChangingClass { 
private boolean started; 

public StateChangingClass() { 
    started = false; 
} 

public void start(){started = true;} 
public void end(){started = false;} 

public boolean checkCondition(double time) { 
    if (started) { 
     if (time>0) {return true;} 
     else {return false;} 
     } 

    else {return false;} 
    } 

}

+2

Ваш примерный код слишком упрощен, какова ваша фактическая проблема, показать проблему в коде, возможно добавить комментарии, какая операция стоит дорого и где вы хотите что-то другое. – luk2302

+2

«Я думаю, что может быть более быстрый способ сделать это». Я сильно сомневаюсь, что это будет медленным. 'return started && time> 0;' довольно просто оценить. –

+0

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

ответ

2

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

public class StateChangingClass { 

    private ConditionChecker conditionChecker; 

    public StateChangingClass() { 
    conditionChecker = StartedChecker.INSTANCE; 
    } 

    public void start() { 
    conditionChecker = StartedChecker.INSTANCE; 
    } 

    public void end() { 
    conditionChecker = EndChecker.INSTANCE; 
    } 

    public boolean checkCondition(double time) { 
    return conditionChecker.check(time); 
    } 

    interface ConditionChecker { 

    boolean check(double time); 
    } 

    static class StartedChecker implements ConditionChecker { 

    public static final ConditionChecker INSTANCE = new StartedChecker(); 

    @Override 
    public boolean check(double time) { 
     return (time > 0); 
    } 
    } 

    static class EndChecker implements ConditionChecker { 

    public static final ConditionChecker INSTANCE = new EndChecker(); 

    @Override 
    public boolean check(double time) { 
     return false; 
    } 
    } 
} 
Смежные вопросы