当前位置: 首页 > 知识库问答 >
问题:

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

阎令
2023-03-14

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

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

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

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个答案

卫弘图
2023-03-14

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

然而,既然你有那么多不同的类型,我建议你把它们放在一个单独的包中,然后把子类的构造函数放在包本地。这样,您可以在抽象类的静态部分构造它们,同时仍然保护外部代码不试图构造一个项。

柴宝
2023-03-14

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

步骤1:完全删除枚举。

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

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

步骤:为每种类型创建子类,为decode方法提供实现:

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();
}
 类似资料:
  • 枚举类(“新的枚举”/“强类型的枚举”)主要用来解决传统的C++枚举的三个问题: 传统C++枚举会被隐式转换为int,这在那些不应被转换为int的情况下可能导致错误 传统C++枚举的每一枚举值在其作用域范围内都是可见的,容易导致名称冲突(同名冲突) 不可以指定枚举的底层数据类型,这可能会导致代码不容易理解、兼容性问题以及不可以进行前向声明 枚举类(enum)(“强类型枚举”)是强类型的,并且具有类

  • 问题内容: 这来自有效的Java: 请注意,操作常量是从创建常量之后运行的静态块放入stringToEnum映射中的。试图使每个常量从其自己的构造函数中放入映射中将导致编译错误。这是一件好事,因为如果合法,它将导致NullPointerException。除编译时常量字段外,不允许枚举构造函数访问枚举的静态字段。此限制是必需的,因为在构造函数运行时尚未初始化这些静态字段。 我的问题是关于这条线的:

  • 问题内容: 基本上,我所做的是为州写一个枚举,我不仅希望能够像州一样访问它们,而且还希望访问它们的缩写以及它们是否是原始殖民地。 这似乎按我预期的那样工作。我可以 对于涉及枚举的特定情况,这是执行此操作的最佳方法,还是设置和格式化此枚举的更好方法?预先感谢所有人! 问题答案: 首先,枚举方法不应大写。它们是与其他方法一样的方法,具有相同的命名约定。 其次,您所做的并不是建立枚举的最佳方法。不要为每

  • 我正在为即将到来的考试做一些修订,我对对象构造函数中枚举的使用有点困惑。

  • 我有一个抽象的超类,它有一个形式的构造函数 并希望创建该抽象类的一个子类,该子类不是以字符串作为其第一个参数,而是采用一个表示给定字符串名称的整数值,例如,0代表某个字符串,1代表另一个字符串,依此类推。 当我尝试编写窗体子类(int number,int amount)的构造函数时,我得到一个格式为“Implicit super constructor is undefined.必须显式调用另一