2015-04-08 2 views
0

Я программирую в Java 7 и теперь мне нужно создать базовый класс BaseCondition для всех конкретных условий. Что я имею в виду, это то, что у меня есть некоторые типы: Date, Integer и некоторые enum s и мне нужно хранить такие условия, как _ALL_INTEGERS > 100 and < 200, _ALL_INTEGERS > 100, _ALL_INTEGERS < 200 и так далее. Даты (более, менее, между). Для enum с я собираюсь выбрать только одно значение сейчас, так что еслиКак создать иерархию классов?

enum BonusType{ 
    BIRTHDAY, 
    REGISTRATION 
} 

тогда условия будут выглядеть BonusType= BIRTHDAY и BonusType= REGISTRATION.

Так что я пытался писать было

public class <T> ConditionBase{ 
    private T low; 
    private T high; 
    //GET, SET 
} 

и использовали low=high, когда мне нужно, чтобы создать условия для перечисления. Все условия будут производный класс следующим образом:

public class DateCondition extends BaseCondition<Date>{ } 
public class BonusTypeCondition extends BaseCondition<BonusType>{ } 

Пример конкретного условия:

BaseCondition c = new BonusTypeCondition(); 
c.setLow(BonusType.BIRTHDAY); 
c.setHigh(BonusType.BIRTHDAY); 

ВОПРОС: Я не уверен, если не попадет в неприятности, когда Я пытаюсь расширить функциональность (добавив более сложные условия). Не могли бы вы предложить что-то более масштабируемое?

+2

Кажется, что вы изобретаете [Предикат] (http://docs.oracle.com/javase/8 /docs/api/java/util/function/Predicate.html) –

ответ

2

Ну, ваша концепция очень близка к хранению Java 8 Lambda/замыкания на каждом случае. Если вы не можете переключать версии, вы должны абстрагироваться от факта, что low или «высокий» может быть неразумным для Enums. Таким образом, ваша истинная основа для состояния должна быть такой:

public interface ConditionBase<T> 
{ 
    boolean fulfills(T object); // True if this object fullfills the condition. 
} 

Это единственный общий случай. Затем вы можете создать некоторые реализации для классов с верхними границами.

public class<T extends Comparable> LessThanX() implements ConditionBase<T> 
{ 
    ... 
    private T value; 

    ... 
    public boolean fullfills(T object) 
    { 
     return object.compareTo(value) < 0; 
    } 
} 

Простите меня, если там есть синтаксические ошибки, моя Java ржаветь, так как я переехал в Скала.

Вы можете определить столько типов условий, сколько хотите, с одним или несколькими внутренними значениями (между isntance). Вы также можете создать некоторые обертки, которые содержат несколько условий внутри них, и проверить объект на всех них и т. Д.

+0

Интересный подход, я возьму его. Но для меня не совсем ясно, как я должен реализовать условие для интервала (DATE BETWEE '2011-11-11' и '2012-12-12')? –

+1

Ну, как и LessTanX, вы можете построить BetweenXY, какой конструктор получает X и Y, тип должен быть сопоставим, а метод fullfills проверяет все условие. Кроме того, вы можете создать CompoundAndCondition с внутренним списком BaseConditions и добавить к нему условия LessThanX и MoreThanX. Проверьте последний абзац ... –

+0

Действительно, спасибо. –

Смежные вопросы