具有许多不同类型/构造函数的枚举类的模式

时间:2013-10-05 20:55:52

标签: java design-patterns enums

我正在使用通信标准(我无法控制),它定义了要在各种数据包中发送/接收的数据项。

每个项目都由自定义类型和类型相关的信息定义。这些项目很少会改变。我希望能够将项目构造函数的范围限制在一个位置,并将那里的所有项目定义为public static(类似于枚举)

目前,我有类型的枚举和项目的类。

enum Type {TYPE_A, TYPE_B, ...}

public class Item {
    public static Item ITEM_1 = new Item(TYPE_A, someNumber);
    public static Item ITEM_2 = new Item(TYPE_B, someNumber, someMap);
    public static Item ITEM_3 = new Item(TYPE_A, someNumber);
    ...

    // Constructor for type A
    private Item(Type type, int param1) {...}

    // Constructor for type B
    private Item(Type type, int param1, Map param2) {...}

    ...

    // Type-dependent methods
    public String decode(byte[] data) {
        switch(this.type) {
        case TYPE_A:
            ...
        }
        case TYPE_B:
            ...
        }
        ...
    }
}

这已经变得无法管理,我正在寻找更好的模式/结构。

我可以有一个抽象的Item类,以及每种类型的子类。通过这种设置,我不知道如何在不将所有构造函数公开的情况下在一个地方定义所有项目。

2 个答案:

答案 0 :(得分:3)

您的实例

第1步:完全删除你的枚举。

第2步:创建一个抽象类:

public abstract class Item {
    public abstract String decode(byte[] data);
    // other common stuff
}

步骤:为每种提供解码方法实现的类型创建子类:

public class ItemType1 extends Item {
    public String decode(byte[] data) {
        // implementation for this type
    }
}

每当您发现自己使用case或instanceof来决定运行哪个代码时,请考虑分解覆盖该方法的新类。这是所有简单的类层次结构。


编辑:

如果您想使用枚举自行记录可用类型的范围,您可以这样做:

enum Type {
    TYPE_A () {
        public Item createItem() {
            return new ItemType1();
        }
    },
    TYPE_B () {
        public Item createItem() {
            return new ItemType2();
        }
    },
    ...;
    public abstract Item createItem();
}

答案 1 :(得分:1)

我会尝试使用抽象类结构,就像你描述的那样:一个抽象项类,以及每种类型的子类。

但是,由于您有许多不同的类型,我建议您将它们放在一个单独的包中,然后使子类的构造函数包为local。这样你就可以在抽象类的静态部分构造它们,同时仍然保护外部代码不会试图构造一个项目。