Static Nested Cass用于在外类中保存多个列表

时间:2016-10-27 01:03:53

标签: java inner-classes

我正在尝试做类似于下面的伪代码的事情。这是否违反使用嵌套类的任何规则或最佳实践?

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:

提到的原因
  • 这是一种逻辑分组仅在一个中使用的类的方法 地方
  • 增加封装
  • 它可以带来更多可读性和 可维护的代码
  • 原因mentioned here

我正在使嵌套类保持静态,因为我不需要直接访问外部类成员。

编辑:为了更具体,我想到了一些问题:我应该使用ENUM而不是嵌套类吗?我应该在嵌套类的5个列表中使用getter / setter吗?嵌套类的构造函数是放置拆分逻辑的正确位置吗?可以直接引用外层类中嵌套类的私有成员吗?等

1 个答案:

答案 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初始化过程的一部分而成为实现细节,并且客户端可能甚至不知道发生了这样的分组。