1
huhu3312 2019-05-11 21:42:18 +08:00 via iPhone
策略模式试试
|
2
HongJay 2019-05-11 21:45:14 +08:00
楼上说的没错吧
|
4
sagaxu 2019-05-11 22:03:39 +08:00 via Android 1
map<type,set>
|
5
yehoha 2019-05-11 22:05:55 +08:00
建议看下表驱动设计模式
|
6
arrow8899 2019-05-11 22:08:42 +08:00
如果你要新增一种类型 Set<D> 还是需要改代码啊;可以用 hashmap 来保存
LinkedHashMap<String, Set<I>> linkedHashMap = new LinkedHashMap<>(); linkedHashMap.put(obj.getClass().getName(), new Set<I>()) linkedHashMap.get(obj.getClass().getName()).add(obj) |
8
Caturra OP |
9
1762628386 2019-05-11 22:27:55 +08:00
没啥必要,你再优化,逻辑还是这个逻辑,顶多就是用枚举将逻辑状态和函数对应
|
10
Corbusier 2019-05-11 22:30:38 +08:00 via iPhone
映射啊,策略模式什么的…
|
11
Caturra OP @1762628386 就是想往后维护更为灵活一点,因为这些类我以后可能要用到 10 个左右,还不止一个地方,一直 if-else 不可取
|
12
skypyb 2019-05-11 23:32:26 +08:00 via Android 1
要是一个类型只会有一个 set 的话(即不出现一个以上的 Set<A>) 那可以用枚举吧。
|
13
AlisaDestiny 2019-05-11 23:32:37 +08:00 2
```java
public class Test1 { public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException { T t = new T(); t.put(new A()); t.put(new B()); t.put(new A()); t.put(new C()); } } class T{ private Set<? super I> aset = new HashSet<>(); private Set<? super I> bset = new HashSet<>(); private Set<? super I> cset = new HashSet<>(); public void put(I item) throws NoSuchFieldException, IllegalAccessException { Field f = T.class.getDeclaredField(item.getClass().getSimpleName().toLowerCase() + "set"); f.setAccessible(true); Object o = f.get(this); if(o instanceof java.util.Set){ ((java.util.Set)o).add(item); } System.out.println("=============="); System.out.println(aset); System.out.println(bset); System.out.println(cset); System.out.println("=============="); } } interface I{ } class A implements I{ } class B implements I{ } class C implements I{ } ``` java 无所不能,你这看下 demo 是你需要的不,传入实现了 I 接口的类,自动根据实例名字添加到对应的 set. PS:需要你 set 的命名符合 实例名.toLowerCase() + "set" 的规则; |
14
Yyyye 2019-05-11 23:57:08 +08:00 via Android 1
我倒是觉得可以将 ab 类处理成一个接口,每个类继承这个接口,接口方法么。public int getType () 变成一个 set 接口获取的时候么,根据 type 返回
|
15
mxalbert1996 2019-05-12 00:25:56 +08:00 1
没必要用反射啊,假设你有 A 和 B 两个类都实现了 Interface 这个接口,那你可以这么写:
public class Test { private Class[] classes = {A.class, B.class}; private HashMap<Class, Set<Interface>> sets = new HashMap<>(); public Test() { for (Class clazz : classes) { sets.put(clazz, new HashSet<>()); } } public void add(Interface value) { Set<Interface> set = sets.get(value.getClass()); if (set != null) { set.add(value); } else { throw new IllegalArgumentException(); } } } |