java - 具有泛型的 Java 类型特定行为
问题描述
问题如下:
有实体 Box、Boxvalue、Boxstrategy,然后作为示例“IntegerBoxStrategy”。这个概念很简单,我想在这个盒子里放不同的类型。有时这个 Box 内会有一个 Integer,有时是一个 String。我希望能够在这些类型之间进行特定的转换(因此类型特定的行为-> 因此我的策略方法。每种类型都需要特定的策略来转换)并且可以使用 ENUM 指定这些类型。
所以在谷歌搜索了很多之后(虽然我很确定这个问题可能被标记为重复并说我没有足够的谷歌搜索;))我正在尝试这种方法: https ://www.javaspecialists.eu/archive/问题123.html
这种方法的简明总结:他们使用一种策略来为纳税人实施税收策略。UML 会更容易理解: 虽然在我的情况下,我只有一个“纳税人”,也就是 BoxType。
仅供参考:这个问题非常相似:尽管基于泛型类的具体类型的条件行为-> 我希望能够在我的 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”类型)
解决方案
推荐阅读
- cmake - 在 Windows 10 上构建 bullet3 - 并非所有库都已安装
- php - 从给定的两个值中从多维数组中查找值
- javascript - 类型不正确。预期的 pk 值,收到的 str(多对多字段)
- php - PHP 中的简单数组推送超出了允许的内存。(允许内存大小33554432字节用尽(尝试分配33554440字节))
- wolfram-mathematica - 内核无法连接到前端
- java - 删除构造函数“Scanner(file)”的这种使用
- python - 我的字符串已嵌入字节字符串 - Python
- python - 根据另一列计算一列的出现次数
- python - 重新训练 Spacy 的名词块
- node.js - 套接字 io 客户端无法连接到远程服务器(套接字服务器)