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编辑来回答我认为你会喜欢的东西。