JAVA更多的类谜题73:你的隐私正在公开

JAVA更多的类谜题73:你的隐私正在公开,第1张

JAVA更多的类谜题73:你的隐私正在公开,第2张

私有成员(即私有方法、域和类型)概念背后的思想是,它们只是实现细节:类的实现者可以随意添加新的私有成员或修改和移除旧的私有成员,而不用担心对该类的客户造成任何损害。换句话说,私有成员完全被包含它们的类封装。
遗憾的是,这种严密的装甲防护仍然存在微小的裂缝。例如,序列化可以打破这种封装。如果一个类被序列化并接受默认的序列化形式,这个类的私有实例域将成为它的导出API的一部分[EJ项目54,55]。当客户正在使用现有的序列化对象时,私有表示的修改将导致异常或错误的行为。
但是编译时错误怎么办?能不能写一个final的“library”类和“customer”类,两个都可以编译没有任何问题,然后给library类加一个私有成员,这样library类还是可以编译,但是customer类就不能再编译了?
如果你的解谜方案是在库类中添加一个私有构造函数,通过默认的公共构造函数来抑制实例的创建,那你就一知半解了。这个谜题需要你添加一个私人成员。严格地说,构造函数不是成员[JLS 6.4.3]。
这个谜题有几种解决方法,其中一种是使用masking:
包库;
公共final类Api {
//私有静态类String{ }
公共静态String new String(){
return new String();
}
}

打包客户端;
导入库。Api
公共类Client {
String s = API . new String();
}

如上所述,程序可以毫无问题地编译。如果我们不注释掉库中本地类字符串的私有声明。Api,Api.newString方法将不再返回java.lang.String类型,因此,变量Client.s的初始化将编译失败:
client/client.java: 4:发现不兼容类型
library . API . string,必选:Java . lang . string
string s = API . new string();
^

尽管我们所做的文本修改只添加了一个私有类声明,但我们间接修改了一个现有公共方法的返回类型,这是一个不兼容的API修改,因为我们修改了导出的API所使用的名称的含义。

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » JAVA更多的类谜题73:你的隐私正在公开

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情