Java 静态嵌套CAS在外部类中保存多个列表

Java 静态嵌套CAS在外部类中保存多个列表,java,inner-classes,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; p

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

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提到的原因,我使用嵌套类

  • 它是一种逻辑分组类的方法,这些类只在一个应用程序中使用 放置
  • 它增加了封装
  • 它可以导致更具可读性和 可维护代码
  • 及原因
我将嵌套类设置为静态,因为我不需要直接访问外部类成员

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


列表1和列表2包含“事件”。根据事件的“类型”,我 将它们分成5个列表

好吧,一般来说,你不应该因为构造函数的副作用而使用它

因此,我可能会选择
Foo
中的
groupEvents
函数。如果分组逻辑相当复杂,那么您可以使用
EventGrouper
无状态服务返回
GroupedEvents
实例或类似
Map
的内容

例如

公共类Foo{
私人集团事件集团事件;
公共Foo(列表1、列表2){
this.groupedEvents=groupEvents(列表1、列表2);
}
private GroupedEvents groupEvents(列表1、列表2){
Map eventsByType=//执行分组
返回新的GroupedEvents(eventsByType);
}
}
如果逻辑足够复杂,可以将
groupEvents
函数移动到嵌套或非嵌套的无状态
EventGrouper
类。设计的重要方面是,
EventGrouper
不应该在其构造函数中执行分组


现在我听到你说,
Foo
现在不是在它的构造函数中进行分组吗?我们不是把问题推到更高的层次吗?当然,虽然分组确实发生在
Foo
的构造过程中,但是
Foo
对象的客户机没有实例化
Foo
实例,只是因为它的分组副作用(希望不会)。分组只是作为
Foo
初始化过程的一部分变成了一个实现细节,客户端甚至可能不知道发生了这样的分组。

很难对这样的抽象设计进行推理。你想解决什么实际问题?如果将两个列表传递到外部实例中,我只需要一种优雅的方法将它们拆分为5个列表,并在外部实例中处理它们(仅限)。这只是一个数据转换过程,如果只是这样的话,我会在外部类中实现一个功能解决方案,我不会为嵌套类或任何形式的OO设计而烦恼。除非您将在这些列表上执行特殊行为。什么是拆分逻辑,如何使用这些逻辑?某些行为是否仅适用于某些列表?列表1和列表2包含“事件”。根据事件的“类型”,我将它们分为5个列表。这些列表没有太多的“行为”,它们只是保存和访问这些特定类型事件的简单方法。你能举一个“功能解决方案”的例子吗?你是说只需在外部类本身中将listsA声明为E,然后调用一个方法来获取2个列表并返回5个列表?如果我使用
GroupedEvents
而不是
Map
,它的成员将只有5个私有列表,对吗?我可以创建一个嵌套的静态类吗?因为它只在Foo中使用?@Gadam如果你只有5种类型的事件,它可能有5个列表,但是如果它只是有一个函数,比如
eventsOfType(EventType)
,来检索特定类型的事件并将它们内部存储在一个映射中,它会更灵活。是的,如果需要,可以嵌套该类,但也可以将其嵌套为公共类,以允许在单元中对其进行测试。
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);
  }
}