如何处理具有数百个字段的Java类?

9
我正在设计一个使用第三方API的程序。该API描述了一个具有296个字段的输入和179个字段的输出。显然,我想要用类来表示输入和输出。对于设计具有如此多字段的类,是否有任何技巧?我应该为每个字段都有一个正常的getter和setter吗?
注意:由于您的要求,API以固定宽度格式的字符串作为输入,并返回以相同格式的字符串作为输出。因此很难从中解释出非扁平结构。

1
如果只是一个容器类,我会将字段设置为公共的,这样你就可以直接修改它们,避免编写所有那些样板方法。 - Matt Ball
7个回答

5

天啊。

一种选择是简单地使用Map或类似的属性持有者。

另一种选择:使用一系列嵌套的类来添加组织(例如Order.Person.ContactInfo.Address.ZipCode,而不仅仅是Order.ZipCode)。我不确定我是否喜欢这个选项,因为它意味着额外的复杂性,但如果没有它,找到你想要的特定getter/setter(比如通过IDE中的自动完成)会变成噩梦。

还有一种选择:如果您创建了一个具有许多属性的单个类,请考虑使用“表达式构建器”模式,在该模式中,每个“setter”返回对象本身,使您能够链接设置器:

myObject.setPropertyA("Foo").setPropertyB("Bar").setPropertyC("Baz")...

这可以创建比之前更快和更流畅的界面。

myObject.setPropertyA("Foo");
myObject.setPropertyB("Bar");
myObject.setPropertyC("Baz");
...

+1 对于建造者模式的熟练掌握。忘了在我的答案中提到这一点。 - David J. Liszewski

3
也许可以对API方法进行包装,特别是对于具有过多参数的方法,可以应用引入参数对象重构技巧,将逻辑相关的参数组合成参数对象。如果结果映射到现有的模型对象中,则可以应用适配器模式。请保留HTML标签。

3
如何进行代码生成?创建一个包含输入参数的文件和另一个包含输出参数的文件。然后创建所需的代码模板:getter、setter、常量等。最后将两者相乘即可。
如果需要重新设计,只需修改模板并重新生成即可。

2

如果终极性能不是最重要的标准,我会认真考虑使用两个哈希表。


EnumMap 应该非常快(枚举序数的非线性读取可能是最糟糕的部分,但我猜这比为不同字段编写不同的代码要好)。 - Tom Hawtin - tackline

2
你可以使用 java.util.Map 替代具有setter/getter的类吗?

1
而且,字段名要有296个常量吗?另外,由于这些字段具有不同的语义类型(文本、数字等),我需要一些抽象化的值。 - C. Ross
如果您需要在代码中与字段名称进行比较,那么您可能仍然需要创建常量。 - Dana the Sane
@Dane 说得有道理,但我通常使用反射和有时使用属性来实现。 - C. Ross

1

哇,这是很多字段啊。不过无论如何...

API如何与这个类交互?如果它提供了所需的类结构实现,那么你应该毫不犹豫地选择它。


API预期的是一个包含所有字段设置为固定宽度格式的字符串,这并没有提供实际帮助。 - C. Ross
哦,非常抱歉:( 祝你好运... - Mike Caron

0

第三方API必须声明一些类型/类来处理输出数据,对吧?假设这个API是一个Java类,那么显然他们需要从他们的方法中返回一个单独的Output对象。

如果是这种情况,为了与这个API交互,我会创建一个包装器对象,其中:

  1. 封装输入字段/对象和输出对象
  2. 具有公共访问器方法,用于与我的程序需要交互的字段(我有一种感觉,您不需要访问所有296个字段)

这样,您的程序的其余部分只需要知道它需要了解的字段的存在,而其余字段(以及第三方对象本身)完全被隐藏/抽象化。


请查看问题的编辑。 - C. Ross
@C. Ross,你的应用程序是否关心来自这个第三方API的每一个输入和输出? - matt b
95%的内容都会在某个地方被使用,即使只是为了让用户能够看到它们。 - C. Ross

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接