Java Wrapper枚举开关多态性

时间:2015-03-18 01:22:45

标签: java design-patterns enums polymorphism wrapper

我从原始界面使用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或其他......更有效。

感谢您的帮助

3 个答案:

答案 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);