我从原始界面使用Wrapper这段代码。在基础上枚举一个将调用链表的方法,如putFirst(T数据),putCurrent(T数据),putLast(),removeFirst(),...
...
@Override
public void put(T data, EnumPosition position) {
switch (position) {
case FIRST:
abstrList.putFirst();
break;
case LAST:
abstrList.putLast();
break;
...
default:
throw new NoSuchElementException("something exception...");
}
@Override
public void remove(T data, EnumPosition position) {
switch (position) {
case FIRST:
abstrList.removeFirst(data);
break;
case LAST:
abstrList.removeLast(data);
break;
...
default:
throw new NoSuchElementException("something exception...");
}
我的EnumPosition现在看起来很简单。 (可以改变它实现一些接口)
public enum EnumPosition {
FIRST, LAST, CURRENT ...
}
A想问一下,如果有可能删除这个开关并将其替换为一些多态,消费者使用java 8中的lambda或其他......更有效。
感谢您的帮助
答案 0 :(得分:1)
枚举状态机怎么样?我不确定它是否能解决您的问题,但您可以尝试编辑您的界面:
public enum EnumPosition {
FIRST {
@Override
public void doPut(){
abstrList.putFirst();
}
@Override
public void doGet(){
abstrList.getFirst();
}
},
LAST {
... // Override methods for LAST
},
CURRENT {
...
},
...
public abstract void doPut();
public abstract void doGet();
}
完成这些更改后,您可以使用此功能避免切换:
...
@Override
public void put(T data, EnumPosition position) {
position.doPut();
}
您可以在此处找到更多信息:https://schneide.wordpress.com/2010/12/13/avoid-switch-use-enum/
答案 1 :(得分:0)
是。但答案取决于你如何使用枚举。
你总是一遍又一遍地传递相同的枚举值,还是混淆了?
如果您始终使用相同的枚举
您可以创建多个包含List
的包装器实现,并创建一个使用枚举来确定实现的工厂(或者使它成为枚举本身的工厂方法)。
MyList<T> list = EnumPosition.LAST.newMyListWrapper(abstrList);
list.put(data);
list.remove(data);
如果您在通话中混淆了您的枚举
如果您同时使用不同的枚举对abstrList
进行操作,那么您必须在枚举中添加put(List<T> list, T data)
和remove(List<T> list, data)
方法:
EnumPosition.LAST.put(abstrList, data);
EnumPosition.CURRENT.remove(abstrList, data);
如果您需要同时支持两种用例,则可以同时执行这两种操作...
答案 2 :(得分:0)
由于您无法扩展枚举,因此您无法直接在枚举中使用多态性。
但是你可以在某种类型的枚举中定义一个实例变量。然后,您可以使用多态,例如
public enum EnumPosition {
FIRST(new FirstElementModification()),
LAST(new LastElementModification())
...;
private ListModification listModification;
private EnumPosition(ListModification listModification) {
this.listModification = listModification;
}
public <T> void put(List<T> list, T element) {
listModification.put(list, element);
}
public void remove(List<?> list) {
listModification.remove(list);
}
}
interface ListModification {
public <T> void put(List<T> list, T element);
public <T> void remove(List<T> list);
}
并实现不同的列表修改策略,如此
class FirstElementModification implements ListModification {
public <T> void put(List<T> list, T element) {
...
}
public <T> void remove(List<T> list) {
...
}
}
从客户端的角度来看,您可以省略开关并只使用
EnumPosition.FIRST.put(someList, someElement);
EnumPosition.LAST.remove(someList);