我正在尝试做类似于下面的伪代码的事情。这是否违反使用嵌套类的任何规则或最佳实践?
public class Foo{
private list1, list2;
Bar bar = new Bar(list1, list2);
// use bar.listA, bar.listB, bar.listC,
//bar.listD, bar.listE
private static class Bar{
private list1, list2;
private listA, listB, listC, listD, listE;
private Bar(list1, list2) {
this.list1 = list1;
this.list2 = list2;
//logic to split list1 and list2 into 5 lists: listA, listB, listC, listD, listE.
//initialize the 5 lists
}
}
}
我使用嵌套类是出于Oracle or the reasons mentioned by Oracle:
提到的原因我正在使嵌套类保持静态,因为我不需要直接访问外部类成员。
编辑:为了更具体,我想到了一些问题:我应该使用ENUM而不是嵌套类吗?我应该在嵌套类的5个列表中使用getter / setter吗?嵌套类的构造函数是放置拆分逻辑的正确位置吗?可以直接引用外层类中嵌套类的私有成员吗?等
答案 0 :(得分:1)
list1和list2包含' event' s。并基于'类型'事件,我 将它们分成5个列表
嗯,作为一般的经验法则,你不应该使用构造函数来解决副作用。
因此,我可能会在groupEvents
内选择Foo
功能。如果分组逻辑相当复杂,那么您可以使用EventGrouper
无状态服务返回GroupedEvents
实例或Map<EventType, List<Event>>
之类的内容。
E.g。
public class Foo {
private GroupedEvents groupedEvents;
public Foo(List<Event> list1, List<Event> list2) {
this.groupedEvents = groupEvents(list1, list2);
}
private GroupedEvents groupEvents(List<Event> list1, List<Event> list2) {
Map<EventType, List<Event>> eventsByType = //perform grouping
return new GroupedEvents(eventsByType);
}
}
如果逻辑足够复杂,您可以将groupEvents
函数移动到无状态EventGrouper
类,无论是否嵌套。设计的重要方面是EventGrouper
不应该在其构造函数中执行分组。
现在我听到你说了,我现在正在Foo
进行分组建设吗?我们只是把问题推到了链条的更高位置吗?好吧,虽然在Foo
构造期间确实发生了分组,但Foo
对象的客户端并没有仅为它实例化Foo
实例&#39;分组副作用(希望它没有)。分组只是作为Foo
初始化过程的一部分而成为实现细节,并且客户端可能甚至不知道发生了这样的分组。