对于嵌套类来说这是一个好的情况吗?如果是这样,它应该是静态的吗?

时间:2015-02-13 18:43:11

标签: java inner-classes

所以我有ClassA

 public ClassA {
     String key;
     List<ClassB> value;
 }

ClassA映射到数据库表(其中2列具有键 - >值列表),此处的值将作为一行存储在其中。

public ClassB {
    Integer data1;
    ...
    String dataN;

   /* constructors and some getters/setters follow */
}

为了澄清,ClassB只包含一些存储在数据库中的数据。

保存ClassA时,List<ClassB>正在转换为JSON字符串并被保存。

有两种方法可以定义ClassB

  1. 要么将它作为普通班级
  2. 将其定义为classA内的内部类(不确定是否为静态)。
  3. ClassB目前尚未在项目的其他任何地方使用。

    您认为应该是正确的方式和原因?

    我对嵌套类感到有点困惑,我无法区分它们是否被滥用。

2 个答案:

答案 0 :(得分:1)

就个人而言,如果该类很小(例如只是一个帮助者)并且不在其他任何地方使用,我宁愿做一个内部类。但是,这主要是一个意见问题。

我认为在这种情况下最好的是确保开发团队中的每个人都以相同的方式工作,这样每个人都可以更轻松地进行调试。

请注意,内部类和嵌套类之间存在差异。嵌套(静态)类是一个声明为static的内部类,而一个简单的内部类通常不是静态的。

可以使用Class.NestedStaticClass在任何地方访问嵌套的静态类。

有关详情和示例,请参阅Nested class documentation

这是我之前给你的链接的有趣引用:

  

内部类的序列化,包括本地类和匿名类,   强烈劝阻。当Java编译器编译确定时   构造,例如内部类,它创建合成构造;   这些是类,方法,字段和其他没有的构造   在源代码中有一个相应的构造。合成的   构造使Java编译器能够实现新的Java语言   功能无需更改JVM。但是,合成构建体可以   不同的Java编译器实现之间有所不同,这意味着   .class文件也可以在不同的实现中变化。   因此,如果序列化,则可能存在兼容性问题   内部类,然后使用不同的JRE反序列化它   实现。请参阅中的隐式和合成参数部分   “获取方法参数名称”部分以获取更多信息   关于内部类生成的合成结构   编译。

您也可以考虑使用匿名内部类。匿名内部类是直接在实例中编码的类。例如

new ParentClassName(constructorArgs) {
   members..
}

答案 1 :(得分:1)

  

ClassB目前尚未在项目的其他任何地方使用。

我认为这里的关键词是“目前”。

如果您想象ClassB可能在项目的其他位置有用(例如,如果该项目以特定方式增长,或者是否有其他表可能映射到同一结构中)未来),那应该是一个“正常”的阶级。

如果该课程与ClassA逻辑关联。例如,ClassA表示列车和ClassB列车,它们总是与列车相关,而不是与其他不是列车的车辆相关,那么您应该将其定义为嵌套类或内部类{ {1}}。

是否使其嵌套或内部取决于类ClassA的对象与ClassB之一之间的连接类型。它并不总是一个明确的问题,但请记住,静态嵌套类可以独立于其父类存在。 (例如,您可以在创建列车对象之前制造列车车辆,并且可以在列车之间移动列车车厢),而内部类别始终包含对其父对象的不可见引用,并且此类对象具有在你可以创建内部类的对象之前存在。

在其他条件相同的情况下,我认为我会赌一个静态嵌套类作为初始解决方案。如果我意识到还有其他地方需要同一个类,那么重构它会相对容易。