我在一个项目中工作,其中有3个类之间的关系:收藏,系列和卡片。
集合有ID和名称。序列具有ID和名称。一张卡有身份证和姓名。
一个集合是20个系列的化合物。一个系列是复合20卡。
所以,我有一个关系,我认为我可以用这种方式来解决:
class Collection {
final String id;
final String name;
final List<Serie> series;
public Collection(String id, String name, List<Serie> series) {
this.id = id;
this.name = name;
this.series = series;
}
}
class Serie {
final String id;
final String name;
final List<Card> cards;
public Serie(String id, String name, List<Card> cards) {
this.id = id;
this.name = name;
this.cards = cards;
}
}
class Card {
final String id;
final String name;
public Card(String id, String name) {
this.id = id;
this.name = name;
}
}
问题是,我必须显示一个布局,其中卡片必须显示名称和以这种方式形成的复合值:集合ID +系列名称+卡ID。
我是否应该为Card添加一个额外的属性来保存该值?或者你觉得怎样才是好的出路?
1条答案
按热度按时间piztneat1#
我是否应该为Card添加一个额外的属性来保存该值?或者你觉得怎样才是好的出路?
这里没有绝对的答案。背景很重要。
正如在评论中所指出的,通常最好将任意表示与内容(“模型”)分开。但如果所需的表示文本是数据模型所表示的实体所固有的,则不是这样。
Collection
、Serie
、Card
)。例如,在 java.time 类中,请参阅DateTimeFormatter
类,它代表诸如LocalDate
之类的日期-时间类生成任意或复杂文本。Collection
,Serie
,Card
)* 应该 * 生成该文本。例如,java.time 类有一个toString
类,它生成标准ISO 8601的文本,还有一个getDisplayName
方法来生成格式化文本。因此,我们无法真正回答您的特定问题,因为我们不了解您从中获得集合,系列和卡片实体的域。
顺便说一下,我们可以简化代码。
如果你的类主要是作为浅不可变数据的透明载体,那么在Java 16+中使用
record
。构造函数、getter、hashCode
&equals
和toString
都是由编译器隐式创建的。在Java 21+中,您可以使用更通用的接口
SequencedCollection
而不是List
。请参见JEP 431: Sequenced Collections。如前所述,
Collection
是Java Collections Framework中类的超接口。如果可能的话,我会选择一个不同的名字。如果是您的域所固有的,则只需小心使用import
语句。您的问题代码将变为:
可以向记录添加其他方法。如果您决定表示文本是模型固有的,则添加一个名为
getDisplayName
的方法。