在编写代码的时候,我们应该遵循“安全构造”技术,即在构造函数里面,不将this暴露给其它类。将this暴露出去有什么危险呢?接下来让我们来看一下,两种情况。
1. 显示的this暴露
public class FatherClass {
FatherClass(){
Listen listen = new Listen();
//在父类中将this暴露给了listen
listen.setFatherClass(this);
}
public void sayHello(){
System.out.println("Hello World!");
}
}
public class SubClass extends FatherClass {
private String name = null;
SubClass() {
super();
name = "frank";
}
//因为name对象还没有被初始化,因此name还是null
public void sayHello() {
System.out.println("Hello World " + name + "!");
}
//输出Hello World null!
public static void main(String[] args) {
SubClass s = new SubClass();
}
}
public class Listen {
public void setFatherClass(FatherClass f){
//调用sayhello方法,因为子类重写了父类的sayhello方法
//调用子类的sayhello方法
f.sayHello();
}
}
2.隐士的this暴露
public class FatherClass {
private String name = null;
FatherClass() {
Listen listen = new Listen();
生成匿名内部类,并且把内部类的this暴露给listen
listen.setInnerClass(new InnerClass() {
public void sayHello() {
sayHelloToMe();
}
});
name = "frank";
}
//name没有被初始化,输出null
public void sayHelloToMe() {
System.out.println("Hello World " + name + "!");
}
public static void main(String[] args) {
FatherClass f= new FatherClass();
}
}
public class Listen {
//调用innerclass的sayHello方法
public void setInnerClass(InnerClass f){
f.sayHello();
}
}
public class InnerClass{
//子类重写了sayhello方法,调用子类的sayhello方法
public void sayHello() {
System.out.println("Hello World!");
}
}
总结:对其它线程能够看见的还未完成构造的对象进行引用显然不是我们所期望的。归根结底,我们如何
正确辨别完全构造好的对象和尚未构造好的对象呢?但通过公布来自构造函数内的
this
引用 ― 直接或间接地通过内部类 ― 我们这样做时,会导致无法预料的后果。为了防止这种危险,在
创建内部类的实例或从构造函数启动线程时,尽量避免使用
this
。如果
无法在构造函数中避免直接或间接使用
this
,则确保不让其它线程看见
this
引用。
参考资料http://www.ibm.com/developerworks/cn/java/j-jtp0618/index.html#ibm-pcon
分享到:
相关推荐
住宅建筑构造11J930是指住宅建筑中使用的各种构造技术和材料的综合应用。以下是相关的知识点: 一、住宅建筑构造的定义 住宅建筑构造是指住宅建筑过程中使用的各种技术和材料,以满足住房的功能和需求。它包括建筑...
汽车网络信息安全技术 AUTOSAR 中SecOC与其他模块的交互 详细SecOC通讯过程图 安全报文介绍 新鲜度值 新鲜度值的构成:基于同步的复合Counter 新鲜度值的管理 新鲜度值中每个计数器详解 新鲜度值的构建 ...
对掘进工作面前方探查出的含导水构造、富水异常区及封闭不良钻孔等,坚持"先治理,后掘进"的防治水技术思路。地面物探、井下直流电法超前物探、工作面钻探相结合,相互印证结论,有效地避免了误揭含水层,保证了巷道施工...
系统构造采用先进的、安全的、高效的分层体系结构;系统实现采用先进 的INTERNET、INTRANET技术、数据库技术、网络技术、多媒体技术。 可行性: 对设计的方案、采用的技术和产品要进行严格的可行性论证,把风险降至...
WH/T 25-2007 《舞台机械 台上设备安全》 WH/T 28-2007 《舞台机械 验收检测程序》 WH/T 27-2007 2.2设计原则 多媒体会议系统的建设遵循"积极兼容、安全可靠、先进实用、统筹规划、分步实施 "的总原则。系统使用的...
本书涵盖了C++程序设计的每一个方面,包括设计和编码风格、函数、操作符、类的设计、继承、构造与析构、赋值、名字空间、模块、模板、泛型、异常、STL容器和算法等。书中对每一条规范都给出了言简意赅的概述,并...
本书的知识体系结构如下所示,遵循了循序渐进的原则,逐步引领读者从基础到各个知识点进行学习。 上篇面向对象技术 第1章Java入门 第2章程序设计基础: 变量及其运算 第3章程序设计基础: 流程控制和数组 第4...
1.3系统的统一性 新办公大楼的网络架构的构造、网络规划和网络管理都建立在"一个整体"的基础之上 。新办公大楼局域网是我行整体网络信息系统的一个子系统,应保证新大楼局域网和我 行整体网络信息系统兼容。 1.4...
先进驾驶辅助系统(Advanced Driver Assistance System,简称ADAS)是智能驾驶技术的一个分支,即通过某种形式的传感器了解周围的环境,以协助驾驶员操作(辅助司机)或完全控制车辆(实现自动化) , 达到提高车辆安全驾驶的...
我们提出了一种改进的构造数据导频(iCDP)方案,该方案遵循该标准并通过考虑时域中相邻数据符号与频域中相邻子载波之间的相关特性来构造数据导频。 与以前的方案相反,后者考虑了时域中的相关性。 结果表明,所提出...
元服务是共享服务平台提供的最细粒度的空间信息服务接口,接口的输入参数和结果输出遵循OGC标准、地址编码或其他规范,基于元服务建设的业务系统,其开发者需根据规范构造请求参数、转发服务请求和解析返回的结果,...
这些规范可以作为每一个开发团队制定实际开发规范的基础,更是每一位C++程序员应该遵循的行事准则。, 涵盖了C++程序设计的每一个方面,包括设计和编码风格、函数、操作符、类的设计、继承、构造与析构、赋值、名字...
这些规范可以作为每一个开发团队制定实际开发规范的基础,更是每一位C++程序员应该遵循的行事准则。, 本书涵盖了C++程序设计的每一个方面,包括设计和编码风格、函数、操作符、类的设计、继承、构造与析构、赋值、...
并且特别注重网站的安全和稳定,采用网络安全、系统 登录安全、各分系统安全、分系统模块安全、会话期间安全等多种方式确保安全。采用 先进的3层结构的编程方式使网站即使在极多访问量的情况下仍能保持稳定和效率。 ...
2.0.8根据本工程特点,施工现场环境,自然条件,施工技术、质量、安全规程和规定等。 3.工程概况 3.0.1**大厦由XX投资兴建;**设计研究总院设计;**监理有限公司监理;**建设有限公司总承包施工。该工程位于**区**内...
施工组织设计的编制始终按照技术可靠、措施得力、确保安全的原则确定施工方案,特别是断层等不良地质地段的隧道施工安全等。在安全措施落实到位,确保万无一失的前提下组织施工。 二、优质高效的原则 加强领导,强化...
严格遵循业界领先的“资源集约化使用和治理”的云计算核心本质,采用“1+N”弹性云架构、云服务、WOA架构、OGSA架构、背景感知计算、内容聚合计算、展现配件渲染计算、OLAM等技术,确保本平台高可用、高扩展、高安全...
HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable。 HashMap允许将null作为一个entry的key或者...
在了解平安需求的根底之上,从平安的规划的角度看,应遵循 以下原那么:平安管理为本的原那么、需求、风险、代价平衡分析的原那么,综合性、 整体性原那么、适应性及灵活性原那么,多重保护原那么。 当今的很多系统...
尽管AJAX技术的出现才不到两年时间,但是AJAX技术遵循了REST的一些重要原则。AJAX技术充分利用了HTTP来获取网络资源并且实现了HTTP没有的对于异步数据进行传输的功能。AJAX技术还使得软件更好地实现分布性功能,在...