这对嵌套类来说是个好情况吗?如果是这样,它应该是静态的吗? [复制]
Posted
技术标签:
【中文标题】这对嵌套类来说是个好情况吗?如果是这样,它应该是静态的吗? [复制]【英文标题】:Is this a good situation for a Nested Class? If so, should it be static? [duplicate] 【发布时间】:2015-02-13 18:43:10 【问题描述】:所以我有一个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
。
-
要么把它作为一个普通的类
将其定义为
classA
中的内部类(不确定是否为静态)。
ClassB
目前没有在项目的其他任何地方使用。
您认为正确的方法应该是什么?为什么?
我对嵌套类有点困惑,我无法区分它们是否被滥用。
【问题讨论】:
任何一个都可以。由你决定。如果您无法决定,请尝试一种方法,然后再重新考虑。 如果您选择将其设为内部,恐怕您希望它是静态的。无论哪种方式都可以。 虽然我喜欢这个问题 - 它的格式很好,而且对实践的理解也存在,但它似乎比任何事情都更容易接受意见。 是的,这里更多的是个人选择。现在,即使我使用嵌套类,我也会对保持它是静态还是非静态感到困惑? 为了避免过于固执己见的答案,您应该包括B
的目的是什么;这样答案实际上可以量化。
【参考方案1】:
就个人而言,如果类很小(例如只是一个助手)并且不用于其他任何地方,我更喜欢做一个内部类。不过,这主要是见仁见智。
我认为在这种情况下,最好的办法是确保开发团队中的每个人都以相同的方式工作,这样每个人都可以更轻松地进行调试。
请注意,内部类和嵌套类之间是有区别的。嵌套(静态)类是声明为静态的内部类,而简单的内部类通常不是静态的。
可以使用Class.NestedStaticClass
在任何地方访问嵌套的静态类。
有关更多详细信息和示例,请参阅Nested class documentation。
这是我之前给你的链接中的一个有趣的引述:
内部类的序列化,包括本地和匿名类, 强烈反对。当 Java 编译器编译某些 构造,例如内部类,它创建合成构造; 这些是类、方法、字段和其他不 在源代码中有相应的构造。合成的 构造使 Java 编译器能够实现新的 Java 语言 无需更改 JVM 的功能。然而,合成结构可以 在不同的 Java 编译器实现之间有所不同,这意味着 .class 文件也可以在不同的实现中有所不同。 因此,如果您序列化一个 内部类,然后用不同的 JRE 反序列化它 执行。请参阅中的隐式和综合参数部分 有关详细信息,请参阅获取方法参数的名称部分 关于内部类生成时生成的合成结构 编译。
您也可以考虑使用匿名内部类。匿名内部类是直接在实例化中编码的类。例如
new ParentClassName(constructorArgs)
members..
【讨论】:
【参考方案2】:
ClassB
目前未在项目的其他任何地方使用。
我认为这里的关键词是“目前”。
如果您设想ClassB
可能在项目的其他地方有用的情况(例如,如果该项目以特定方式增长,或者如果将来有其他表可能映射到相同的结构),那么它可能应该是一个“普通”类。
如果类在逻辑上绑定到ClassA
。例如,ClassA
代表一列火车,ClassB
火车车厢,它们始终与火车相关,而与非火车的其他车辆无关,则应将其定义为 ClassA
的嵌套类或内部类。
是嵌套还是内部取决于ClassB
类对象和ClassA
之一之间的连接类型。这并不总是一个明确的问题,但请记住,静态嵌套类可以独立于其父类而存在。 (例如,您可以在创建火车对象之前制造火车车厢,并且您可以在火车之间移动火车车厢),而内部类始终包含对其父对象的不可见引用,并且这样的对象具有在创建内部类的对象之前存在。
在其他条件相同的情况下,我想我会赌一个静态嵌套类作为初始解决方案。如果我意识到还有其他地方需要相同的类,那么重构它会相对容易。
【讨论】:
以上是关于这对嵌套类来说是个好情况吗?如果是这样,它应该是静态的吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章