Java 构造结构私有化
Java 构造结构私有化
单例设计模式:(Singleton)
在一般情况下,一个类只有通过产生对象之后才可以操作这个类。
class Singleton { public void print() { System.out.println("Hello,world!") ; } } public class TestDemo { public static void main(String [] args) { Singleton s = null ; //声明对象 s = new Singleton() ; //实例化对象 s.print() ; } } |
在Singleton类中,实际上存在构造方法【Java规定,没有定义一个构造的化,Javac编译后会自动生成一个无参构造方法】
class Singleton { private Singlenton() { } //构造方法私有化 public void print() { System.out.println("Hello,world!") ; } } public class TestDemo { public static void main(String [] args) { Singleton s = null ; //声明对象 s = new Singleton() ; //实例化对象 s.print() ; } } |
一旦构造方法私有化,在外部将无法直接new实例化对象操作
在构造方法使用private声明,使得构造私有化,无法被外部调用(即无法实例化);既然无法在外部调用,则可以在类的内容调用;
class Singleton { Singleton instance = new Singleton() ; //new实例化Singleton对象 private Singlenton() {} //构造方法私有化 public void print() { System.out.println("Hello,world!") ; } } |
现在的instance在Singleton里面只是一个普通的类属性,而所有的普通类属性必须在类产生实例化对象之后才可以使用,但是否可以存在一种属性,可以让类属性不受Singleton类的实例化对象的控制;如果使用 static 声明 instance 属性,那么就表示可以在一个类没有产生实例化对象的时候,直接使用该属性
public class TestDemo { public static void main(String [] args) { Singleton s = null ; //声明对象 s = Singleton.instance ; //直接访问static声明的类属性 s.print() ; } } |
在类定义时,类属性需要进行封装;而一旦封装属性之后,只可以通过getter方法来实现访问属性,由此需要提供一个geter方法不受到类的new实例化控制;可以使用static属性继续声明该方法。
class Singleton { static Singleton instance = new Singleton() ; //new实例化Singleton对象 private void Singlenton() { return ; } //构造方法私有化 public static Singleton getInstance() { return instance ; } //方法中返回了static声明不受实例化影响的类属性 public void print() { System.out.println("Hello,world!") ; } } public class TestDemo { public static void main(String [] args) { Singleton s = null ; //声明对象 s = Singleton.getInstance(); //访问static声明的方法 s.print() ; } } |
上述代码和public普通(非私有)构造的区别:
上述代码所创建的类,或者创建多个类对象,实际上创建的对象是同一个,因为同一个的那个唯一性的对象是在类中创建的,而外部调用的只不过是类中声明实例化的一个对象而已。
上述代码的意义:
如果需要控制一个类中实例化对象的产生个数,必须将构造给private私有化(锁住类中的构造方法)因为在实例化新对象的时候都要使用构造方法,如果构造方法私有化,自然无法直接产生新的实例化对象,既然只需要一个实例化对象,由此可以在类的内部定义一个公共对象,并且每一次通过static方法返回唯一的一个对象,这样外部不管是多少次的调用,最终的类只能产生唯一的对象,这样的设计属于单例设计模式。
如果在static声明的方法中,返回的不是唯一的实例化对象的类属性,而是在方法中直接返回实例化对象,结果就是,每一个返回的对象都不是唯一的;为了防止这种情况发生,可以在instance类属性定义的时候,定义为 final 属性,加上final属性后,唯一性更加强烈。 |
完整的单例设计模式Demo:
class Singleton { private static final Singleton INSTANCE = new Singleton() ; //new实例化Singleton对象 private void Singlenton() { return ; } //构造方法私有化 public static Singleton getInstance() { return INSTANCE ; } public void print() { System.out.println("Hello,world!") ; } } public class TestDemo { public static void main(String [] args) { Singleton s = null ; //声明对象 s = Singleton.getInstance(); //访问static声明的方法 s.print() ; } } |
单例设计模式的特点:
构造方法私有化,在类的内部定义static属性与方法,利用static方法取得本类中的实例化对象,由此,无乱外部产生多少个Singleton对象,但是本质上通过static方法获得的类实例化对象都是同一个(唯一的一个)
核心目的:让一个在整个系统中只存在一个实例化对象
单例设计的两种形式:
饿汉式:不管是否使用;在定义static的类属性时就直接实例化对象
懒汉式:只有第一次使用的时候,才会实例化操作;在定义static类属性的时候不会实例化对象,而是在第一次调用类属性的时候,if判断类属性是否为null,为null则实例化;
多例设计模式:
多例设计模式可以让一个类产生指定多个实例化对象;例如定义一个表示一周时间数的类,这个类只有七个实例化对象;定义表示性别的类,这个类只能有两个实例对象;
定义表示性别的类:
class Sex { private String title ; private static final Sex MALE = new Sex("男") ; private static final Sex FEMALE = new Sex("女") ; private Sex(String title) { this.title = title ; } public String toString() { return this.title ; } public static Sex getInstance(int ch) { switch ( ch ) { case 1 : return MALE ; case 2 : return FEMALE ; default : return null ; } } } public class TestDemo { public static void main(String [] args) { Sex s = null ; //声明对象 s = Sex.getInstance(2); System.out.println(s) } } |
多例设计模式的一个目的:
在一个类中产生多个对象,根据不同的请求,获得不同的实例化对象。
不管设计模式如何,核心就是构造方法私有化!
Java 构造结构私有化的更多相关文章
- Java内存结构、类的初始化、及对象构造过程
概述 网上关于该题目的文章已经很多,我觉得把它们几个关联起来讲可能更好理解一下.与其它语言一样,它在执行我们写的程序前要先分配内存空间,以便于存放代码.数据:程序的执行过程其实依然是代码的执行及数据的 ...
- Java虚拟机 - 结构原理与运行时数据区域
http://liuwangshu.cn/java/jvm/1-runtime-data-area.html 前言 本来计划要写Android内存优化的,觉得有必要在此之前介绍一下Java虚拟机的相关 ...
- Java 语言结构【转】
Java 语言结构 基础:包(Package).类(Class)和对象(Object) 了解 Java 的包(Package).类(Class)和对象(Object)这些基础术语是非常重要的,这部分内 ...
- Java构造和解析Json数据的两种方法详解二
在www.json.org上公布了很多JAVA下的json构造和解析工具,其中org.json和json-lib比较简单,两者使用上差不多但还是有些区别.下面接着介绍用org.json构造和解析Jso ...
- Java 内存结构备忘录
本文详细描述了 Java 堆内存模型,垃圾回收算法以及处理内存泄露的最佳方案,并辅之以图表,希望能对理解 Java 内存结构有所帮助.原文作者 Sumith Puri,本文系 OneAPM 工程师编译 ...
- 使用递归算法结合数据库解析成java树形结构
使用递归算法结合数据库解析成java树形结构 1.准备表结构及对应的表数据a.表结构: create table TB_TREE ( CID NUMBER not null, CNAME VARCHA ...
- JAVA循环结构
JAVA循环结构:顺序结构只能执行一次,如果要执行多次需要用到循环 JAVA中的循环结构有while:do...while:for: 1.while循环:先判断布尔表达式中的值,若为true,执行循环 ...
- JVM规范系列第2章:Java虚拟机结构
本规范描述的是一种抽象化的虚拟机的行为,而不是任何一种(译者注:包括 Oracle 公司自己的 HotSpot 和 JRockit 虚拟机)被广泛使用的虚拟机实现. 记住:JVM规范是一种高度抽象行为 ...
- java内存结构学习的一种打开方式
用Java开发已经四年,中途学了python,Scala,接触这些开发语言后,总感觉Java就像老奶奶裹脚——又臭又长.然,Java虐我千百遍,我待Java如初恋.聊起Java,不得不谈Java的内存 ...
随机推荐
- 松软科技web课堂:JavaScript 数据类型
字符串值,数值,布尔值,数组,对象. JavaScript 数据类型 JavaScript 变量能够保存多种数据类型:数值.字符串值.数组.对象等等: var length = 7; // 数字 va ...
- Cobalt Strike系列教程第五章:截图与浏览器代理
Cobalt Strike系列教程分享如约而至,新关注的小伙伴可以先回顾一下前面的内容: Cobalt Strike系列教程第一章:简介与安装 Cobalt Strike系列教程第二章:Beacon详 ...
- vue中使用props传递参数
通常,父组件的模板中包含子组件,父组件要正向地向子组件传递数据或参数,子组件收到后根据参数的不同来渲染不同的内容,或者执行操作. 这个正向传递数据的过程是通过props来实现的. 在组件中,子组件使用 ...
- Servlet 使用介绍(3)
说明 本篇记录一个Servlet的创建过程和基本使用.由于,Servlet是基于Http协议使用的,所以,可以在http协议的基础上作一些改变,来修改适用我自己的servlet. Servlet使用 ...
- 使用docker运行springboot项目
本文主要讲的是使用docker运行springboot项目 获取一个springboot项目 这里我没有重新构建,用的之前写的一个项目,直接从github上下载下来,地址:https://github ...
- AJAX 实现form表单提交
1.使用Ajax实现异步操作,点击登录按钮后,即触发form表单的提交事件,数据传输至后端 JSP: <script type="text/javascript" src=& ...
- matlab练习程序(螺线拟合)
这里待拟合的螺线我们选择阿基米德螺线,对数螺线类似. 螺线的笛卡尔坐标系方程为: 螺线从笛卡尔坐标转为极坐标方程为: 阿基米德螺线在极坐标系下极径r和极角theta为线性关系,方程为: 计 ...
- Android常用adb命令总结(二)
adb shell 命令 简单点讲,adb 命令是 adb 这个程序自带的一些命令,而 adb shell 则是调用的 Android 系统中的命令,这些 Android 特有的命令都放在了 Andr ...
- Xml之Schema XSD约束{详细}
问题: 学习Schema其他标签的定义 约束 引入的方式: 基本格式: 1构建schema: 1.1 最基本的单位元素 1.2 元素属性 1.3 simpleType 定义类型 1.4 复合结构类型 ...
- php-laravel框架用户验证(Auth)模块解析(一)
一.初始化 使用php artisan命令进行初始化:php artisan make:auth 和 php artisan migrate(该命令会生成users表.password_resets表 ...