具有泛型的Java类型特定行为

时间:2019-03-07 13:40:10

标签: java design-patterns switch-statement

问题如下:

有实体Box,Boxvalue,Boxstrategy,然后例如“ IntegerBoxStrategy”。 这个概念很简单,我想在此框中输入其他类型的类型。有时,此Box内会有一个Integer,有时是String。我希望能够在这些类型之间进行特定的转换(因此,特定类型的行为->因此是我的策略方法。每种类型都需要特定的策略进行转换),并且可以使用ENUM指定这些类型。

因此,在进行了很多搜索之后(尽管我非常确定这个问题可能会被标记为重复,并说我没有对Google进行足够的搜索;)))我正在尝试这种方法: https://www.javaspecialists.eu/archive/Issue123.html

此方法的简要摘要:他们使用一种策略为纳税人实施税收策略。 UML将更容易理解: UML class diagram for first link 尽管就我而言,我只有一个“纳税人”,也就是BoxType。

fyi:这个问题确实很相似:尽管Conditional behaviour based on concrete type for generic class->我希望能够在BoxValues之间切换,并将“ true”转换为“ 1”。但是我认为答案的方法可能会有所帮助,运行时类型识别。在我的情况下,该策略将用于将策略与其相应的“受支持类型”进行匹配。

第一个链接的问题是,在每个特定的策略实施中,我都会有一个巨大的转变。 (稍后将提供示例代码)

我的问题不是“请帮我解决这个问题”,而更多是指向一般方向。如果给出一个简单的例子,当您支持一个新的“ boxvaluetype”而不必更新每个特定的策略实现时,如何做到这一点,我将非常高兴。如果可能的话,我希望根据GRASP原则最干净的设计实现或方法。

 public interface typeStrategy {
    boolean canChangeToType(Object myvalue,ValueType type);
    boolean correctType(Object myvalue);
}

class BoolTypeStrategy implements typeStrategy{

    @Override
    public boolean canChangeToType(Object myvalue, ValueType type) {
        if (correctType(myvalue))
            throw new IllegalArgumentException("your initial value should be a boolean!");
        switch (type){
            case INT:
                return true;
            case STRING:
                return true;
            default:
                return false;
        }
    }

    @Override
    public boolean correctType(Object myvalue) {
        if (!(myvalue instanceof Boolean))
            return false;
        return true;
    }
}

在示例中,此ValueType是我的Enum。

public class BoxValue<T> {
    private T value;
    private typeStrategy mystrategy;


    public BoxValue(T value, typeStrategy strategy) {
        this.value = value;
        this.mystrategy = strategy;
    }

    public T getValue() {
        return value;
    }

    public boolean canChangeToType(ValueType type){
        return mystrategy.canChangeToType(value, type);
    }
}

如您所见,巨大的开关解决了这个问题。那么,什么设计模式,什么建议可以解决这个问题呢? (仅供参考:我想在Java 8中解决此问题,因为我知道Java10 +中存在这些奇怪的“ var”类型)

0 个答案:

没有答案