Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中静态私有类的问题_Java_Oop_Encapsulation - Fatal编程技术网

java中静态私有类的问题

java中静态私有类的问题,java,oop,encapsulation,Java,Oop,Encapsulation,如果我有一个javaclass SpecificDialog并且在该类中我有一个用于构建SpecificDialog对象的public静态类生成器,那么Builder位于SpecificDialog内部的原因是它在逻辑上属于那里,因为它只能用于构建指定的日志。这是主要原因吗 但是,如果Builder在SpecificDialog内,则我的SpecificDialog可以访问Builder的每个private字段/成员。这可能是不可取的,因为我可能会无意中从外部SpecificDialog修改一些

如果我有一个java
class SpecificDialog
并且在该类中我有一个用于构建
SpecificDialog
对象的
public静态类生成器
,那么
Builder
位于
SpecificDialog
内部的原因是它在逻辑上属于那里,因为它只能用于构建指定的日志。这是主要原因吗

但是,如果
Builder
SpecificDialog
内,则我的
SpecificDialog
可以访问
Builder
的每个
private
字段/成员。这可能是不可取的,因为我可能会无意中从外部
SpecificDialog
修改一些此类私有
Builder的
字段

是否对此无能为力?如果不行,我是否应该理解这不是一个大问题?

主要是从结构上分离和重组复杂代码,并提供方法来处理Java的缺点,使用回调(例如,作为闭包的等价物,它最终将在Java 8中可用)


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

无论您选择什么设计,您总是能够无意中做一些不应该做的事情。使构建器成为它所构建的类的静态内部类是一种常用的习惯用法,因为外部类可以访问构建器的私有字段。将构造函数视为外部类的一个组成部分,就像一个私有字段或方法,并确保类和它的生成器按照它们应有的行为运行。

虽然我理解,一般来说,外部类访问内部类的私有字段是有用的,但对于构造器模式,我不能完全理解。打个比方:据我们所知,没有一座建筑能够访问其建设者的数据,如建筑平面图,如果它能够访问,它就可以控制自己的建筑过程,这与《终结者》电影中的情况不一样,这是不可取的。因此我提出了一个问题。然后你也应该问自己,为什么我们使用构造函数和工厂方法,因为你见过一个可以自己建造的建筑吗?虽然使用隐喻来形象化和理解面向对象编程的原理很有用,这也是一种误导:你说的不是一座实体建筑,而是一个软件。建筑没有自己的行为——软件对象有。同样,通过你的类比,建筑等同于编译的程序——类代表建筑平面图。同样,建筑隐喻是误导性的。这对你没有帮助。对创造模式的争论就像是对烹饪的食谱的争论:这完全取决于你想做什么——至少在某种程度上取决于味道。我不确定我是否理解你关于构造函数的论点。