【发布时间】:2019-09-04 08:38:22
【问题描述】:
我正在开发一个在 NoSQL 数据库(确切地说是 Elasticsearch)上写入的应用程序,我必须管理十几个(数量随时间增长)不同的文档类,即具有众多字段的类,它们的getter 和 setter 以及将类转换为 JSONObject 的方法(每个字段都用 @JsonProperty(PROPERTY_NAME) 注释,我们使用 JSON 解析器)。
所有这些类都有一些共同的字段和方法,它们都包含在一个超类中(让我们称之为DocZero),但它们都有自己的自定义字段,这让我明白了这一点。
确实这些字段是自定义的,但有些字段以非线性方式在不同的类之间共享,也就是说我有我的文档类Doc1,...DocN,我有一些字段集(大约 10截至目前)由他们以非常狂野的方式分享。
一些最能表达情况的例子:Doc1 包含Set1 到Set5;Doc2 包含Set1、Set2 和Set5 到Set8;Doc3 包含 Set6 和 Set7;Doc4 包含 Set5 和 Set7;Doc5 包含 Set1、Set2 和 @987654434343 @到Set10。
鉴于我需要获取和设置这些字段,并且不时使用它们来操作文档,我使用 Set# 制作了接口,每个接口都包含(抽象)setter 和 getter。
因此,当我声明一个类时
public class DocX implements SetA, SetB, SetC
我被提醒实现方法并因此添加必填字段,但这意味着实现相同集合的所有类都需要具有相同的参数和相同的方法,这意味着我需要编写许多相同的代码次(有时超过 getter 和 setter 方法)。
将所有字段添加到 DocZero 之前的不同 Doc# 类是我不热衷于使用的解决方案,因为我更喜欢区分不同的文档类型,并且由于这种情况存在,在较低的数量级,在另一个代码的一部分,AnotherDocZero、AnotherDoc# 和 AnotherSet# 由于其他限制而无法合并,我也希望有一个潜在的解决方案。
我觉得这是多重继承可以解决问题的情况之一,但不幸的是 Java 不允许这样做。
在这种情况下如何避免重复?你有什么建议可以改善我对这个问题的处理吗?
【问题讨论】:
-
虽然我不知道如何避免重复简单的 getter/setter,但可以通过委托避免重复重要部分:stackoverflow.com/questions/13245610/…
-
您可以提取各自类型的字段集,并编写这些对象的实际文档,因此它实际上被建模为
Doc2 contains Set2,Set2是一个实际的类实例。 -
@dyukha:当我说“非平凡的部分”时,我应该更清楚,但问题是,当我处理集合时,我更喜欢而不是 setter实现
add方法(因此首先检查参数是否为非空)。其他重要的方法在别处管理。 -
@M.Prokhorov:您是否建议使用接口所需的参数创建类,然后使用
@JsonUnwrap之类的东西来获取平面JSON?我记得不久前做过类似的事情,当我第一次尝试在没有接口的情况下解决问题时,但由于其他复杂性而放弃了它(我不记得这些是什么了)。 -
@Phraeq,您可能遇到了欺骗问题,因为您委托给了
SetX对象的方法。我建议您在文档中添加getSetX()。
标签: java database java-8 code-duplication