继承公共接口的枚举中的代码重复

2024-02-02

我有几个符合通用接口的枚举:

    interface TableColumns
    {
      String getColumnName();
      int getColumnIndex();
      ColumnType getColumnType();
      boolean isEditable();
      int getColumnWidth();
    }

一个典型的实现是:

enum PointsTableColumns implements TrendTableColumns
{
    POINTS_COLUMN("points_column", false, ColumnType.TEXT, 400, 0);

    private String columnName;
    private boolean editable;
    private ColumnType columnType;
    private int columnWidth;
    private int columnIndex;

    private PointsTableColumns (String columnName, boolean editable, ColumnType columnType,
        int columnWidth,
        int columnIndex)
    {
        this.columnName = columnName;
        this.editable = editable;
        this.columnType = columnType;
        this.columnWidth = columnWidth;
        this.columnIndex = columnIndex;
    }

    public boolean isEditable()
    {
        return editable;
    }

    public int getColumnIndex()
    {
        return columnIndex;
    }

    public String getColumnName()
    {
        return columnName;
    }

    public int getColumnWidth()
    {
        return columnWidth;
    }

    public ColumnType getcolumnType()
    {
        return columnType;
    }
}

我有几个像这样的实现(10+),每个实现都有多个且几乎不同的值。现在的问题是,我在这里看到很多代码重复,因为所有实现中的方法都是逐字相同的。我知道在 Java 中这几乎是不可能的,因为枚举无法扩展实现。 我在这里需要的是一个建议或一个不同的策略,可以以更干净的方式完成此操作。是否已经存在一些与此相关的现有模式?


如果您可以接受一级间接,那么我下面介绍的方法会将重复代码减少到最低限度。

首先,考虑以下供应商接口及其内部类:

public interface PropertiesSupplier {

    Properties properties();

    public static final class Properties {

        private final int value1;

        private final String value2;

        private final double value3;

        private Properties(int value1, String value2, double value3) {
            this.value1 = value1;
            this.value2 = value2;
            this.value3 = value3;
        }

        public static Properties of(int value1, String value2, double value3) {
            return new Properties(value1, value2, value3);
        }

        public int getValue1() {
            return this.value1;
        }

        public String getValue2() {
            return this.value2;
        }

        public double getValue3() {
            return this.value3;
        }

        @Override
        public String toString() {
            return "Properties [value1=" + this.value1 + ", value2=" + this.value2 + ", value3=" + this.value3
                    + "]";
        }
    }
}

这里没什么神奇的。内部类只是一个 beanprivate final字段、用于初始化它们的私有构造函数、公共 getter、工厂方法和重写toString()方法。该接口仅定义一种返回内部类实例的方法。请注意,内部类是最终的。这个想法是强制不变性,这样它的属性就不允许改变。

然后,让我们创建几个将实现此接口的枚举。让我们从MyEnum1,它定义了两个值:

public enum MyEnum1 implements PropertiesSupplier {
    ENUM_1_CONST_1(Properties.of(1, "hello", 0.123)), 
    ENUM_1_CONST_2(Properties.of(2, "goodbye", 7.54));

    private final Properties p;

    private MyEnum1(Properties p) {
        this.p = p;
    }

    @Override
    public Properties properties() {
        return this.p;
    }
}

接下来是MyEnum2,它只定义一个值:

public enum MyEnum2 implements PropertiesSupplier {
    ENUM_2_CONST_1(Properties.of(9, "hey dude", 547.21578));

    private final Properties p;

    private MyEnum2(Properties p) {
        this.p = p;
    }

    @Override
    public Properties properties() {
        return this.p;
    }
}

如您所见,两个枚举都实现了PropertiesSupplier接口,因此他们必须提供一个实现Properties properties()方法。为了遵守这一点,他们必须封装一个实例Properties,他们在构造函数中收到。

所以现在,在这种间接寻址之后,所有枚举中唯一重复的代码就是Properties字段、接收它作为参数的构造函数及其 getter 方法。

这是一个显示如何使用枚举的示例:

MyEnum1 e1 = MyEnum1.ENUM_1_CONST_2;
MyEnum2 e2 = MyEnum2.ENUM_2_CONST_1;

System.out.println(e1.name() + " - " + e1.properties());
System.out.println(e2.name() + " - " + e2.properties());

此代码产生以下输出

ENUM_1_CONST_2 - Properties [value1=2, value2=goodbye, value3=7.54]
ENUM_2_CONST_1 - Properties [value1=9, value2=hey dude, value3=547.21578]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

继承公共接口的枚举中的代码重复 的相关文章

  • 在画布上绘图

    我正在编写一个 Android 应用程序 它可以在视图的 onDraw 事件上直接绘制到画布上 我正在绘制一些涉及单独绘制每个像素的东西 为此我使用类似的东西 for int x 0 x lt xMax x for int y 0 y lt
  • Java JDBC:更改表

    我希望对此表进行以下修改 添加 状态列 varchar 20 日期列 时间戳 我不确定该怎么做 String createTable Create table aircraft aircraftNumber int airLineCompa
  • 在 HTTPResponse Android 中跟踪重定向

    我需要遵循 HTTPost 给我的重定向 当我发出 HTTP post 并尝试读取响应时 我得到重定向页面 html 我怎样才能解决这个问题 代码 public void parseDoc final HttpParams params n
  • 制作一个交互式Windows服务

    我希望我的 Java 应用程序成为交互式 Windows 服务 用户登录时具有 GUI 的 Windows 服务 我搜索了这个 我发现这样做的方法是有两个程序 第一个是服务 第二个是 GUI 程序并使它们进行通信 服务将从 GUI 程序获取
  • 无法展开 RemoteViews - 错误通知

    最近 我收到越来越多的用户收到 RemoteServiceException 错误的报告 我每次给出的堆栈跟踪如下 android app RemoteServiceException Bad notification posted fro
  • 多个 Maven 配置文件激活多个 Spring 配置文件

    我想在 Maven 中构建一个环境 在其中我想根据哪些 Maven 配置文件处于活动状态来累积激活多个 spring 配置文件 目前我的 pom xml 的相关部分如下所示
  • 加速代码 - 3D 数组

    我正在尝试提高我编写的一些代码的速度 我想知道从 3d 整数数组访问数据的效率如何 我有一个数组 int cube new int 10 10 10 我用价值观填充其中 然后我访问这些值数千次 我想知道 由于理论上所有 3d 数组都存储在内
  • 反射找不到对象子类型

    我试图通过使用反射来获取包中的所有类 当我使用具体类的代码 本例中为 A 时 它可以工作并打印子类信息 B 扩展 A 因此它打印 B 信息 但是当我将它与对象类一起使用时 它不起作用 我该如何修复它 这段代码的工作原理 Reflection
  • Spring Data JPA 应用排序、分页以及 where 子句

    我目前正在使用 Spring JPA 并利用此处所述的排序和分页 如何通过Spring data JPA通过排序和可分页查询数据 https stackoverflow com questions 10527124 how to query
  • 磁模拟

    假设我在 n m 像素的 2D 表面上有 p 个节点 我希望这些节点相互吸引 使得它们相距越远吸引力就越强 但是 如果两个节点之间的距离 比如 d A B 小于某个阈值 比如 k 那么它们就会开始排斥 谁能让我开始编写一些关于如何随时间更新
  • 路径中 File.separator 和斜杠之间的区别

    使用有什么区别File separator和一个正常的 在 Java 路径字符串中 与双反斜杠相反 平台独立性似乎不是原因 因为两个版本都可以在 Windows 和 Unix 下运行 public class SlashTest Test
  • 无法解析插件 Java Spring

    我正在使用 IntelliJ IDEA 并且我尝试通过 maven 安装依赖项 但它给了我这些错误 Cannot resolve plugin org apache maven plugins maven clean plugin 3 0
  • Java TestNG 与跨多个测试的数据驱动测试

    我正在电子商务平台中测试一系列商店 每个商店都有一系列属性 我正在考虑对其进行自动化测试 是否有可能有一个数据提供者在整个测试套件中提供数据 而不仅仅是 TestNG 中的测试 我尝试不使用 testNG xml 文件作为机制 因为这些属性
  • JRE 系统库 [WebSphere v6.1 JRE](未绑定)

    将项目导入 Eclipse 后 我的构建路径中出现以下错误 JRE System Library WebSphere v6 1 JRE unbound 谁知道怎么修它 右键单击项目 特性 gt Java 构建路径 gt 图书馆 gt JRE
  • Eclipse Java 远程调试器通过 VPN 速度极慢

    我有时被迫离开办公室工作 这意味着我需要通过 VPN 进入我的实验室 我注意到在这种情况下使用 Eclipse 进行远程调试速度非常慢 速度慢到调试器需要 5 7 分钟才能连接到远程 jvm 连接后 每次单步执行断点 行可能需要 20 30
  • Java执行器服务线程池[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 如果我使用 Executor 框架在
  • Google App Engine 如何预编译 Java?

    App Engine 对应用程序的 Java 字节码使用 预编译 过程 以增强应用程序在 Java 运行时环境中的性能 预编译代码的功能与原始字节码相同 有没有详细的信息这是做什么的 我在一个中找到了这个谷歌群组消息 http groups
  • 如何从泛型类调用静态方法?

    我有一个包含静态创建方法的类 public class TestClass public static
  • 有没有办法为Java的字符集名称添加别名

    我收到一个异常 埋藏在第 3 方库中 消息如下 java io UnsupportedEncodingException BIG 5 我认为发生这种情况是因为 Java 没有定义这个名称java nio charset Charset Ch
  • java.lang.IllegalStateException:驱动程序可执行文件的路径必须由 webdriver.chrome.driver 系统属性设置 - Similiar 不回答

    尝试学习 Selenium 我打开了类似的问题 但似乎没有任何帮助 我的代码 package seleniumPractice import org openqa selenium WebDriver import org openqa s

随机推荐

  • 计算n的最佳方法选择k?

    评估 价值 最有效的方法是什么 n choose k 我认为的蛮力方法是找到n k n k 通过单独计算每个阶乘 更好的策略可能是根据这个使用DP递归公式 https i stack imgur com Kq3OH png nCk n 1
  • WHERE IN问题中的SQL占位符,插入字符串失败

    作为我工作的一部分 我需要编写 SQL 查询来连接到我们的 PI 数据库 要生成查询 我需要传递一个array标签 本质上是主键 但这些必须作为字符串插入 由于这将是一个模块化查询并用于多个标签 因此使用了占位符 该查询依赖于 WHERE
  • OpenGL - ARB 扩展

    我使用的是 MacBook Pro 13 英寸 2010 年中 并且使用 OpenGL 我注意到 库中缺少一些功能 我在互联网上找到了有关我的硬件的规格 上面写着 支持OpenGL 3 3 这很奇怪 所以我打印了我的 OpenGL 版本并这
  • 使用deathbycaptcha服务处理Google recaptcha v2时如何控制scrapy中的请求流?

    你好 我正在使用 python 使用 scrapy 网络爬行框架 抓取网站并使用 Deathbycaptcha 服务解决我在其页面上遇到的验证码 我的下载延迟设置为 30 秒 我只抓取几页来获取基本信息 这样我就不会过多地占用网站带宽或任何
  • 中断当前正在执行的所有 asyncio.sleep

    where 这是在 Linux Python 3 5 1 上 what 我正在开发一个监控流程asyncio 他们在不同地方的任务await on asyncio sleep不同时长的呼叫 有时我希望能够打断所有所说的话asyncio sl
  • 在哪里放置与 IPython“冻结模块”调试器警告相关的 Python 配置代码?

    我刚刚在 Macintosh 上使用了 brew 来升级我的设置 现在 当我运行时 我收到此 调试器警告 jupyter notebook 其他文字被剪掉 I 09 03 00 955 NotebookApp Jupyter Noteboo
  • Flux:如何让一个动作等待存储?

    我正被一个 React 问题困住了 我确信这个问题不会像我现在看起来那么困难 我正在针对 RESTful 服务器 API 构建一个单页应用程序 该 API 返回资源以及描述可以使用该资源执行的操作的链接 我试图确保我的客户端的 ajax 调
  • 将 DataMemberAttribute 放在接口成员上意味着什么?

    放置一个是什么意思数据成员属性 http msdn microsoft com en us library system runtime serialization datamemberattribute aspx在接口成员上 这对派生类有
  • 绘制位图 C# [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我正在尝试使用位图类在屏幕上绘制图像
  • 标准库算法是否允许复制谓词参数?

    假设我们想从向量中删除重复值ints 通常的解决方案是对向量进行排序并使用擦除删除惯用语删除重复项 但我们需要保持不会被移除的元素的顺序 所以我们无法排序 所以人们可能会想出这样的谓词并使用 with withremove if算法 str
  • 任意或自定义 URL 的 Rails 功能测试

    我的 Rails 应用程序中有一个名为 Photo 的 RESTful 资源 我在用着回形针 http www thoughtbot com projects paperclip为我的照片提供不同的 样式 缩略图等 并且我使用自定义路由来以
  • 是否可以通过 AJAX 加载 tumblr 帖子?

    我只是想知道是否可以通过 AJAX 加载 tumblr 帖子 我知道可以使用注释 但我想内联加载帖子的内容 我不是在谈论无限滚动 Thanks 对的 这是可能的 我编写了一些代码来读取帖子的标题并在我的网站上创建一个菜单 您可以访问帖子的全
  • 如何向我的 UIPageViewController 添加多个 ViewController?

    所以我对 Obj C 很陌生 并尝试查看示例代码和其他在线资源来回答我的问题 但我似乎找不到任何真正有帮助的东西 本质上 我想做的是将我在 Storyboard 中创建的多个 UIViewController 添加到 UIPageViewC
  • 分而治之和递归

    我想知道分而治之的技术是否总是将一个问题划分为同一类型的子问题 通过相同类型 我的意思是可以使用递归函数来实现它 分而治之总是可以通过递归来实现吗 Thanks 总是 是一个可怕的词 但我无法想到不能使用递归的分而治之的情况 根据定义 分而
  • 有条件包含在 linq to 实体中?

    我觉得以下应该是可能的 我只是不确定采取什么方法 我想做的是使用 include 方法来塑造我的结果 即定义沿对象图遍历多远 但是 我希望这种遍历是有条件的 something like dealerships include d gt d
  • 将 numpy 数组保存为 jpg 格式的 io.BytesIO

    我正在使用 xlsxwriter 在 python 代码中将图像插入到 Excel 中 现在 我在 opencv 处理之后有了图像数据 numpy 数组 我想将此图像数据插入到 Excel 中 但 xlswriter 仅支持 io Byte
  • 是否有使用线程池的 std::async 实现?

    标准功能std 异步 http en cppreference com w cpp thread async 模板函数 async 异步运行函数 f 可能在一个单独的线程中 该线程可能是线程池的一部分 并返回一个 std future 它最
  • 我们如何删除 Liferay 徽标、登录超链接和 Powered BY ?从屏幕上

    我使用 Liferay 6 和 Tomcat 进行开发 我为我的应用程序开发了一个自定义登录 POrtlet 现在进入http 本地主机 8086 http localhost 8086 显示我的自定义登录页面 请查看屏幕截图 我的问题是
  • Objective C + Reskit - 如何用键包装我的字典以避免格式问题?

    我正在尝试用密钥包装我的 HTTP POST 请求 换句话说 我想把这个变成 category id gt 1 food name token gt Pizza id gt 1 进入这个 dish gt category id gt 1 f
  • 继承公共接口的枚举中的代码重复

    我有几个符合通用接口的枚举 interface TableColumns String getColumnName int getColumnIndex ColumnType getColumnType boolean isEditable