构造方法的私有——转载于谷文仁

在讲解本操作之前,首先来观察如下的程序。

class Singleton { // 定义一个类

public void print() {

System.out.println("Hello World .") ;

}

}

public class Test {

public static void main(String args[]) {

Singleton inst = null ;   // 声明对象

inst = new Singleton() ;         // 实例化对象

inst.print() ;         // 调用方法

}

}

在以上的程序之中,Singleton类里面是存在构造方法的(因为如果一个类之中没有明确的定义一个构造方法的话,则会自动生成一个无参的,什么都不做的构造方法),但是下面要将构造方法改变一下。

class Singleton { // 定义一个类

private Singleton() {} // 构造方法私有化

public void print() {

System.out.println("Hello World .") ;

}

}

现在发现在实例化Singleton类对象的时候,程序出现了编译错误,因为构造方法被私有化了,无法在外部调用,即:无法在外部实例化Singleton类的对象。

那么现在就需要思考:在保证Singleton类之中的构造方法不修改不增加,以及print()方法不修改的情况下,如何操作,才可以让类的外部通过实例化对象再去调用print()方法?

思考过程一:使用private访问权限定义的操作只能被本类所访问,外部无法调用,那么现在既然构造方法被私有化了,就证明,这个类的构造方法只能被本类所调用,即:现在在本类之中产生本类实例化对象。

class Singleton { // 定义一个类

Singleton instance = new Singleton() ;

private Singleton() {}   // 构造方法私有化

public void print() {

System.out.println("Hello World .") ;

}

}

思考过程二:对于一个类之中的普通属性,默认情况下一定要在本类存在了实例化对象之后才可以进行调用,可是现在在Singleton类的外部无法产生实例化对象,那么必须想一个办法,让Singleton类中的instance属性可以在没有Singleton类实例化对象的时候来进行调用,可以使用static完成,static定义的属性特点:由类名称直接调用,并且在没有实例化对象的时候也可以调用。

class Singleton { // 定义一个类

static Singleton instance = new Singleton() ;

private Singleton() {}   // 构造方法私有化

public void print() {

System.out.println("Hello World .") ;

}

}

public class Test {

public static void main(String args[]) {

Singleton inst = null ;   // 声明对象

inst = Singleton.instance ;   // 实例化对象

inst.print() ;         // 调用方法

}

}

思考过程三:类之中的全部属性都应该封装,所以以上的instance属性应该进行封装,而封装之后要想取得属性要编写getter方法,只不过这个时候的getter方法应该也由类名称直接调用,定义为static型。

class Singleton { // 定义一个类

private static Singleton instance = new Singleton() ;

private Singleton() {}  // 构造方法私有化

public void print() {

System.out.println("Hello World .") ;

}

public static Singleton getInstance() {

return instance ;

}

}

public class Test {

public static void main(String args[]) {

Singleton inst = null ;   // 声明对象

inst = Singleton.getInstance() ;    // 实例化对象

inst.print() ;         // 调用方法

}

}

思考过程四:这样做的目的?此时程序之中的instance属性,属于static,那么表示所有Singleton类的对象,不管有多少个都共同拥有同一个instance属性,那么既然是有同一个,那么又有什么意义呢?

现在做一个简单的思考:如果说现在一个类只希望有唯一的一个实例化对象出现,应该控制构造方法,如果构造方法对外部不可见了,那么现在肯定无法执行对象的实例化操作,必须将构造方法隐藏,使用private隐藏。

既然清楚了这个目的,不过本程序依然有一个问题。

public static Singleton getInstance() {

instance = new Singleton() ;

return instance ;

}

本操作语法没有错误,也不需要考虑是否有意义,但是现在的代码是允许这样做的,而这样做发现之前表示唯一一个实例化对象的所有努力就白费了,那么必须想办法废除掉这种做法,可以在定义instance的时候增加一个final关键字。

class Singleton { // 定义一个类

private static final Singleton INSTANCE = new Singleton() ;

private Singleton() {}   // 构造方法私有化

public void print() {

System.out.println("Hello World .") ;

}

public static Singleton getInstance() {

return INSTANCE ;

}

}

public class Test {

public static void main(String args[]) {

Singleton inst = null ;   // 声明对象

inst = Singleton.getInstance() ;        // 实例化对象

inst.print() ;         // 调用方法

}

}

这样的设计在设计模式上讲就称为单例设计模式(Singleton)。

面试题:请编写一个Singleton程序,并说明其主要特点?

class Singleton { // 定义一个类

private static final Singleton INSTANCE = new Singleton() ;

private Singleton() {}   // 构造方法私有化

public void print() {

System.out.println("Hello World .") ;

}

public static Singleton getInstance() {

return INSTANCE ;

}

}

public class Test {

public static void main(String args[]) {

Singleton inst = null ;   // 声明对象

inst = Singlet

inst = Singleton.getInstance() ;        // 实例化对象

inst.print() ;         // 调用方法

}

}

这样的设计在设计模式上讲就称为单例设计模式(Singleton)。

面试题:请编写一个Singleton程序,并说明其主要特点?

class Singleton { // 定义一个类

private static final Singleton INSTANCE = new Singleton() ;

private Singleton() {}   // 构造方法私有化

public void print() {

System.out.println("Hello World .") ;

}

public static Singleton getInstance() {

return INSTANCE ;

}

}

public class Test {

public static void main(String args[]) {

Singleton inst = null ;   // 声明对象

inst = Singleton.getInstance() ;        // 实例化对象

inst.print() ;         // 调用方法

}

}

特点:构造方法被私有化,只能够通过getInstance()方法取得Singleton类的实例化对象,这样不管外部如何操作,最终也只有一个实例化对象,在单例设计模式之中,一定会存在一个static方法,用于取得本类的实例化对象。

对于单例设计模式,在日后的开发之中,只会用到此概念,但是具体的代码很少去编写。

扩展(可以不会):

对于单例设计模式按照设计模式的角度而言,分为两种:

· 饿汉式:之前写的程序就属于饿汉式,因为在类之中的INSNTACE属性是在定义属性的时候直接实例化;

· 懒汉式:在第一次使用一个类实例化对象的时候才去实例化。

范例:观察懒汉式

class Singleton { // 定义一个类

private static Singleton instance ;

private Singleton() {}   // 构造方法私有化

public void print() {

System.out.println("Hello World .") ;

}

public static Singleton getInstance() {

if (instance == null) {   // 没有实例化

instance = new Singleton() ;  // 实例化

}

return instance ;

}

}

这些概念清楚就行了,对于单例设计再次强调:记清楚代码的结构以及操作的特点,以后这种代码虽然不会由你自己去写,但是概念一定会用到。

转载地址:http://www.cnblogs.com/guwenren/archive/2013/04/12/3016489.html

时间: 2024-10-25 12:01:26

构造方法的私有——转载于谷文仁的相关文章

15年双11手淘前端技术巡演 - H5性能最佳实践(转载,好文)

转载:原文链接 前言 2015年是全面『无线化』的一年,在BAT(财报)几家公司都已经超过50%的流量来自移动端,这次 双11 更是占到了68.67%无线交易 (天猫微博). 手淘中大量的业务采用H5的方式开发,H5体验好坏全面影响着手淘的使用体验. 今年手机淘宝在技术上重点解决“顿”,“卡”,“慢”的问题,并提出了“521法则” ,具体指: App内存节省50% 绘制帧率,滑动体验提升20% App全链路实现 1S 法则 强网(4G/Wifi)实现1S首屏(包括图片)加载 3G 1S首包返回

[转载]正则表达式参考文档 - Regular Expression Syntax Reference.

正则表达式参考文档 - Regular Expression Syntax Reference. [原创文章,转载请保留或注明出处:http://www.regexlab.com/zh/regref.htm] 引言 正则表达式(regular expression)就是用一个“字符串”来描述一个特征,然后去验证另一个“字符串”是否符合这个特征.比如 表达式“ab+” 描述的特征是“一个 'a' 和 任意个 'b' ”,那么 'ab', 'abb', 'abbbbbbbbbb' 都符合这个特征.

见到Unicode、GB2312、GBK 、ANSI、Ascii、DBCS、BIG5、UTF这一堆名词你是否犯晕?请看转载的好文

作者:于洋链接:https://www.zhihu.com/question/23374078/answer/69732605来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同的状态,以表示世界上的万物.他们看到8个开关状态是好的,于是他们把这称为”字节“.再后来,他们又做了一些可以处理这些字节的机器,机器开动了,可以用字节来组合出很多状态,状态开始变来变去.他们看到这样是好的,于是它们就这机器称为”

(转载)Excel文档保存的时候,提示“文档未保存”

亲测,成功搞定 Excel文档保存的时候,提示“文档未保存”? 先打开你需要处理的excel,然后打开工具栏--宏--录制新宏--确定--停止录制宏--宏-宏--编辑--复制以下程序Sub 恢复保存()     name0 = ActiveWorkbook.Name     j = Sheets.Count     For i = 1 To j         Sheets(1).Visible = -1         Sheets(1).Move         Sheets(1).Move

[转载]MFC一个文档不同视图

MDI(MultipleDocument Interface)是Windows界面的一种规范,它建立多个窗口来浏览文档数据,如Windows中的ProgramManager等都是按MDI规范实现的.在实际工程软件开发中,许多程序员将其作为一种实现多窗口的标准方法.微软基础类库(MicrosoftFoundationClassLibrary,简称MFC库),是微软公司为方便Windows程序开发所提供的一个功能强大的通用类库.MFC的核心是以类的形式封装了大量WindowsAPI.在可视化编程语言

【转载国外好文】代工开发一个iOS应用没有那么容易

导读:这是来自新加坡的 iOS 开发者 Kent Nguyen 发表在1月底的一篇博文.这篇吐槽文在 iOS 开发圈子里流传甚广,从原文150多个评论就可见一斑,现翻译如下. 让我们开门见山吧:做一个iPhone应用需要花多少钱? 就是这个最常见的问题,我的很多朋友(大多是些西装革履的商务人士),还有我那些个对技术一知半解的客户们,他们都问过我这个的问题.通常,我会先给出一个大致的报价,这个报价并没有细致到需要签合同确认每一个功能点的地步.即便是这样,每当的我报价一出口,对方都毫无例外的给惊着了

转载 - 读网上文档 - 笔记 - JS 编程最佳实践(Best Practice)

原文地址: 1). JavaScript Best Practices: http://www.w3schools.com/js/js_function_closures.asp 2). JavaScript Closures http://www.w3schools.com/js/js_function_closures.asp 3). JavaScript 严格模式 http://blog.csdn.net/supersky07/article/details/14129179 1. 关于全

使用JITStack私有云构建文档管理系统的优势

自智能设备面世后,经历了十多年的发展,这些设备在项目管理方面为互联网和移动商务带来了前所未有的便捷,设备体积在不断缩小,但功能却在指数式增长. 最能代表项目工作流的文档是管理人员仍然在使用的印刷图纸.手工笔记,出于某些因素,物理文档始终在一些特定的场合发挥着重要作用.这并不能够影响私有云介入以简化工作流,或许私有云在早期的建设中需要承受一定的费用,但今后,通过私有云可以消除很大一部分风险而且是一种长期保存的方法. JITStack私有云的成本和效率 若要通过私有云建设一套新的文档管理系统,前期投

私有构造方法为什么要抛异常?

私有构造方法为什么要抛异常? 不知道有没有小伙伴浏览过JDK源码,发现有些私有构造方法里也要抛出异常.那么疑问来了?构造方法都私有了.也不能调用,抛异常不是多此一举吗? 答案是否定的. 先来看一个例子:java.util.Objects public final class Objects { private Objects() { throw new AssertionError("No java.util.Objects instances for you!"); } } 在源码里