【问题标题】:Trouble with static private classes in javajava中静态私有类的问题
【发布时间】:2012-11-01 10:19:20
【问题描述】:

如果我有一个 java class SpecificDialog 并且在该类中我有一个 public static class Builder 用于构建 SpecificDialog 的对象,那么 BuilderSpecificDialog 内部的原因是因为它在逻辑上属于那里因为它只能用于构建 SpecifcDialogs。这是主要原因吗?

但是如果BuilderSpecificDialog 内,那么我的SpecificDialog 可以访问Builder 的每个private 字段/成员。这可能是不可取的,因为我可能无意中从外部SpecificDialog 修改了一些这样的私有Builder's 字段。

是否对此无能为力,如果没有,我是否可以理解这不是一个大问题?

【问题讨论】:

    标签: java oop encapsulation


    【解决方案1】:

    无论您选择何种设计,您总会在不经意间做出不该做的事情。使构建器成为它构建的类的静态内部类是一个常见的习惯用法,正是因为外部类可以访问构建器的私有字段。将构建器视为外部类的一个组成部分,就像私有字段或方法一样,并确保该类及其构建器按应有的方式运行。

    【讨论】:

    • 虽然我知道,一般来说,外部类访问内部类的私有字段很有用,但对于 Builder 模式,我不能完全理解这一点。打个比方:我们知道没有任何建筑物能够访问其建造者的数据,例如建筑平面图,如果它能够控制自己的建造过程,这与终结者电影中不受欢迎的情况类似。因此有我的问题。
    • 那你也应该问问自己为什么我们使用构造函数和工厂方法,因为你见过自建的建筑吗?
    • 虽然使用隐喻来可视化和理解面向对象编程的原则很有用,但它也具有误导性:它不是您所说的物理建筑,而是一个软件。建筑物没有自己的行为——软件对象有。
    • 另外,通过你的类比,建筑相当于编译好的程序——类代表建筑计划。
    • 再次,建筑隐喻具有误导性。它不会帮助你。争论创造模式就像争论使用哪种食谱来烹饪:这完全取决于你想要烹饪的东西——至少在某种程度上,取决于口味。我不确定我是否理解你关于构造函数的论点。
    【解决方案2】:

    main reason for declaring inner classes 用于在结构上分离和重组复杂代码,并提供通过回调处理 Java 缺点的方法(例如,作为闭包的等价物,最终将在 Java 8 中可用)。

    由于本质上,内部类是外部类的结构部分,对所有成员的完全访问不仅可以,而且是可取的——这实际上使它成为一个有用的工具!如果没有此功能,内部类的行为方式将与任何类完全相同 - 因此没有任何优势。

    【讨论】:

      猜你喜欢
      • 2022-11-20
      • 2011-05-03
      • 1970-01-01
      • 1970-01-01
      • 2011-07-04
      • 1970-01-01
      • 2020-11-12
      • 2013-12-17
      • 1970-01-01
      相关资源
      最近更新 更多