1

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

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

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

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 类,以及每种类型的子类。使用这种设置,我不知道如何在一个地方定义所有项目而不公开所有构造函数。

4

2 回答 2

3

您的实例没有不同的类型,它们不同的类型。

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

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

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();
}
于 2013-10-05T21:14:44.520 回答
1

我会尝试使用抽象类结构,就像您描述的那样:抽象项目类和每种类型的子类。

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

于 2013-10-05T21:02:42.523 回答