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

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&lt;ClassB&gt; 被转换为 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 之一之间的连接类型。这并不总是一个明确的问题,但请记住,静态嵌套类可以独立于其父类而存在。 (例如,您可以在创建火车对象之前制造火车车厢,并且您可以在火车之间移动火车车厢),而内部类始终包含对其父对象的不可见引用,并且这样的对象具有在创建内部类的对象之前存在。

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

【讨论】:

以上是关于这对嵌套类来说是个好情况吗?如果是这样,它应该是静态的吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

java类的测试( main函数)

在嵌套 *ngFor 循环中访问索引

在 perl 中使用嵌套映射是一种好习惯吗?

可以在 Firefox 中更改“保存的密码”样式吗?

这对我的 jQuery 脚本来说是一个好的结构吗?

aix的内存怎么查看,我用vmstat查看内存使用率到了80%,这对机器油影响吗?还有交换内存是啥?谢谢