Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 具有许多不同类型/构造函数的类枚举的模式_Java_Design Patterns_Enums - Fatal编程技术网

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

Java 具有许多不同类型/构造函数的类枚举的模式,java,design-patterns,enums,Java,Design Patterns,Enums,我正在使用一种通信标准(我无法控制),该标准定义了在各种数据包中发送/接收的数据项 每个项目都由自定义类型和类型相关信息定义。这些项目很少会改变。我希望能够将项构造函数的范围限制在一个地方,并将那里的所有项一次性定义为公共静态(类似于枚举) 目前,我有一个用于类型的枚举和一个用于项目的类 enum Type {TYPE_A, TYPE_B, ...} public class Item { public static Item ITEM_1 = new Item(TYPE_A, som

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

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

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

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

我会尝试使用抽象类结构,如您所述:一个抽象项类,以及每种类型的子类


但是,由于您有那么多不同的类型,我建议您将它们放在一个单独的包中,然后使子类包的构造函数成为本地的。通过这种方式,您可以在抽象类的静态部分构造它们,同时仍然保护外部代码不尝试构造项。

我会尝试使用抽象类结构,如您所述:一个抽象项类,以及每种类型的子类

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

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

步骤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
    }
}
<> >每当您发现自己使用一个实例或实例来决定要运行哪个代码时,请考虑突破覆盖该方法的新类。这是所有简单的类层次结构


编辑: 如果要使用枚举对可用类型的范围进行自我记录,可以执行以下操作:

enum Type {
    TYPE_A () {
        public Item createItem() {
            return new ItemType1();
        }
    },
    TYPE_B () {
        public Item createItem() {
            return new ItemType2();
        }
    },
    ...;
    public abstract Item createItem();
}
您的实例没有不同的类型,它们是不同的类型

步骤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
    }
}
<> >每当您发现自己使用一个实例或实例来决定要运行哪个代码时,请考虑突破覆盖该方法的新类。这是所有简单的类层次结构


编辑: 如果要使用枚举对可用类型的范围进行自我记录,可以执行以下操作:

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

为什么不使用
enum
s?枚举可以有字段、方法和构造函数。将
类设置为
枚举
是一个很好的建议。但这并不能完全解决问题。我仍然会有20多个构造器。。。每个枚举常量一个。@Firyce您能使用varargs将它们全部组合起来吗?@PeterLawrey这是可以做到的,但我认为varargs在这里没有意义。每个构造函数中与类型相关的参数在性质上各不相同。@Firyce可以使用多个工厂方法,而不是多个构造函数。这将确保类型与使用的参数匹配。为什么不使用
enum
s?枚举可以有字段、方法和构造函数。将
类设置为
枚举
是一个很好的建议。但这并不能完全解决问题。我仍然会有20多个构造器。。。每个枚举常量一个。@Firyce您能使用varargs将它们全部组合起来吗?@PeterLawrey这是可以做到的,但我认为varargs在这里没有意义。每个构造函数中与类型相关的参数在性质上各不相同。@Firyce可以使用多个工厂方法,而不是多个构造函数。这将确保类型与使用的参数匹配。“您的实例没有不同的类型,它们是不同的类型。”感谢您的“啊哈!”片刻。正是我想听的。我决定用这个方法来执行范围。你可以考虑--EngEd编辑来回答一些我认为你会喜欢的事情:“你的实例没有不同的类型,它们是不同的类型。”谢谢“AHA”。片刻。正是我想听的。我决定用这个方法来执行范围。你可以考虑--Enter编辑来回答我认为你会喜欢的东西。