- 浏览: 2046266 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (795)
- java (263)
- 聚类搜索引擎 (9)
- 经验之谈 (67)
- DSP (3)
- C++ (140)
- Linux (37)
- SNMP (6)
- Python (6)
- 数据库 (61)
- 网络 (20)
- 算法 (15)
- 设计模式 (4)
- 笔试题 (38)
- 散文 (35)
- 数据结构 (9)
- 银行知识 (0)
- 榜样 (9)
- Lucene (15)
- Heritrix (6)
- MetaSeeker (0)
- netbeans (12)
- php (3)
- 英语 (8)
- DB2 (0)
- java基础 (5)
- mongodb & hadoop (4)
- Javascript (7)
- Spring (4)
- ibatis & myibatis (1)
- velocity (1)
- 微服务 (0)
- paddle (1)
- 第三方 (0)
- 知识沉淀 (1)
- 建模 (0)
最新评论
-
0372:
标示对java很陌生!
中文乱码解决的4种方式 -
梦留心痕:
Java中\是转意字符, 可是你的这句话我没看懂,只要把得到的 ...
java中如何忽略字符串中的转义字符--转载 -
yanjianpengit:
[b][/b]
java为什么非静态内部类里面不能有静态成员 -
springdata-jpa:
可以参考最新的文档:如何在eclipse jee中检出项目并转 ...
eclipse 如何把java项目转成web项目 -
qq1130127172:
,非常好。
(转)SpringMVC 基于注解的Controller @RequestMapping @RequestParam..
在Java中,构造函数的访问级别通常是public, 它提供了一个构造该类对象的接口。可是你知不知道,把构造函数的级别设为private, 有一些特别用处。
先来看一段代码:
//Shape.java
public class Shape {
private Shape() {
}
public static Shape makeShape() {
System.out.println("here is the shape you ordered");
return (new Shape());
}
public static void main(String args[]) {
Shape.makeShape();
}
}
首先从语言角度分析,我们可以知道, 任何类的使用者都无法使用构造函数来生成一个图形, 因为构造函数是私有的,无法被类以外的函数使用。而只能通过调用makeShape来实现。
也许你会问,为什么不直接使用构造函数来生成图形,而需要使用一个看上去多余的makeShape方法呢?
这样做有以下几个好处:
1。你可以返回任何的Shape类型,包括Shape的子类。比如你可以把makeShape写成这样:
public static Shape makeShape() {
System.out.println("here is the shape you ordered");
if (retangle)
return (new Retangle());
if (Circle)
return (new Circle());
}
这里假设Retangle 和 Circle 都是shape的子类,并且和Shape类在同一个包內,Shape类可以访问子类的构造函数。这样shape就提供了一个图形工厂。用户通过一个接口就可以生成不同的图形。事实上,这种用法被称为“工厂模式”。
2。可以实现一个类只有一个对象。请看下面的代码
//Handler.java
public class Handler {
private Handler handler = null;
private Handler() {
}
public static getHandler() {
if (!handler)
handler = new Handler();
return handler;
}
public static void main(String args[]) {
Handler.getHandler();
}
}
当handlerw为空时,那么重新构造一个handler,然后返回;如果已经构造过了,那么就直接返回已经存在的handler。这种用法被称为“Singleton pattern". 如果直接使用构造函数来构造对象,那么你就无法控制生成的数量。在实际应用中,往往会做一些改变。比如使用一个具有一定容量的池,当需要构造一个对象而池的容量仍未满时,就构造一个新的对象,并放入池中,并把对象的状态设为“占用”状态;当需要构造一个对象而池的容量已满,则从池中选一个“空闲”状态的对象返回,并把对象的状态设为“占用”。当对象使用完后再回收到池中并把状态设为“空闲“。
这种模式的一个典型应用场景是:
在一个具有很多用户的web站点里,需要一个对象来单独处理一个连接,而每一个连接的时间比较短。如果每次连接都创建一个对象然后又很快销毁,那么创建和销毁对象的系统开销是很大的。这种时候可以使用对象池,这样就免去了创建和销毁对象的开销。
3。可以方便的拋出异常。请看下列代码:
public class Test {
public Test() {
double x = 1.0/0.0;
}
public static void main(String args[]) {
try {
Test test = new Test();
}catch (Exception e){
System.out.println(e.toString());
}
}
}
编译,执行,你会发现这个异常不会被捕捉,没有任何输出;即使尝试在构造函数中捕捉异常也不行。看下列代码:
public class Test {
public Test() {
try {
System.out.println("trying to throw an exception");
double x = 1.0/0.0;
} catch(Exception e) {
System.out.println("Exception captured");
}finally {
System.out.println("inside finally");
}
}
public static void main(String args[]) {
Test test = new Test();
}
}
编译,运行,结果为:
trying to throw an exception
inside finally
原因是JVM把构造函数产生的异常丢弃了。试想你正在使用一个第三方的类库提供的类,那个类提供一个共有的构造函数,它允许你通过参数构造一个类的对象,可是如果你的参数不合法,导致在构造函数中产生一个异常,那么你永远不知道具体发生了什么。当然如可以在每次构造对象时进行参数合法性检查,可是假设你要构造好多这样的对象??那将是一场灾难。这时可以通过把构造函数的访问级别设为私有,强迫类的使用者使用一个工厂函数来生成需要的对象,那么就可以在这个函数中统一的进行参数检查了。具体的代码就不写了,留给读者去实践吧!
从上面的分析我们可以知道私有构造函数的威力。需要注意的一点是,即使你的构造函数什么都不做,比如:
private Shape() {}
你仍然要显示的定义,因为如果你不定义,那么Java会自动为你生成一个空构造函数,而这个空构造函数是共有的。
发表评论
-
流式计算
2022-02-07 14:31 279private void postHandle(List& ... -
消息队列使用的四种场景介绍
2018-08-09 16:34 2471以下介绍消息队列在实际应用中常用的使用场 ... -
设计模式
2018-04-11 16:49 9801.桥梁模式,将抽象部分与实现部分隔离开,抽象部分持有实现 ... -
Spring boot web可以访问Service和Mapper层
2018-03-26 16:42 2861Spring boot的web层可以访问Service层,然 ... -
FreeMarker的基础语法使用 && 心得和技巧
2018-01-10 10:03 2053FreeMarker是一个模板引 ... -
webService----wss4j+cxf实现WS-Security(基于UsernameToken)
2017-10-23 18:58 1554分享一下wss4j+cxf基于UsernameToken的安 ... -
Spring MVC之LocaleResolver(解析用户区域)
2017-09-23 15:55 2517为了让web应用程序支持国际化,必须识别每个用户的首选区域, ... -
(转)java泛型
2016-11-12 20:29 1646http://www.cnblogs.com/lwbqqyu ... -
java中如何忽略字符串中的转义字符--转载
2016-06-28 16:42 9899原文地址:http://my ... -
(转)关于JAP FetchType.LAZY(hibernate实现)的理解 .
2016-04-27 15:22 5104JPA定义实体之间的关系有如下几种: @OneToOne ... -
(转)hibernate annotation注解方式来处理映射关系
2016-04-26 16:52 1836http://www.cnblogs.com/xiao ... -
代码片段,导出的文件头
2015-11-18 20:34 1600public static void setDownload ... -
(转)为什么要两次调用encodeURI来解决乱码问题
2015-08-03 20:19 2481地址:http://blog.csdn.net/howla ... -
杀死进程
2015-07-21 14:54 1285sudo lsof -i :9000 COMMAND P ... -
批处理batch,执行多个SQL语句
2015-07-15 19:21 10609批处理batch,执行多个SQL语句。 ... -
中文乱码解决的4种方式
2015-07-03 14:20 2627目前收集到4中方法,中文传参一documentPath为例: ... -
GET请求的中文乱码问题及处理意义
2015-07-03 13:47 6631首先看一段乱码的程序 ... -
java.ByteArrayInputStream与ByteArrayOutputStream再次理解
2015-03-16 17:59 3235第一次看到ByteArrayOutputStream的时 ... -
(转)SpringMVC 基于注解的Controller @RequestMapping @RequestParam..
2014-07-28 17:42 2272概述 继 Spring 2.0 对 Spring MVC ... -
java中序列化的serialVersionUID解释
2014-07-25 09:26 1883serialVersionUID: 字面意思上是序列化的版本号 ...
相关推荐
### Java中的私有构造函数:理解其特殊用途与设计模式应用 #### 一、引言 在Java编程语言中,构造函数(Constructor)是用于初始化新创建的对象的关键组成部分。默认情况下,构造函数的访问级别设置为`public`,...
- 工厂方法:通过私有构造函数与静态工厂方法相结合,可以控制对象创建的过程。 - 防止继承:如果设计的类不应当被其他类继承,可以通过私有构造函数实现。 - 全局配置类:有些类代表全局配置或者资源,不应当被多次...
私有构造函数也常用于其他设计模式,如工厂模式或抽象工厂模式。在这些模式中,类的实例化过程被封装在工厂类内部,这样可以灵活地替换或扩展类的实现,同时保持客户端代码不变。 总结来说,私有构造函数在C#中...
在Java中,私有构造方法是通过将构造函数声明为private来实现的,这使得其他类无法直接实例化该类的对象。本文将深入探讨私有构造方法的应用及其在单态模式中的作用。 首先,我们来看一个简单的例子,演示了如何将...
在Java中,通常通过私有构造函数和静态工厂方法来实现单例。单例模式常用于控制共享资源,如线程池、数据库连接或者配置对象。其优点在于节省内存,减少对系统资源的消耗,同时保证了对象间的同步。 **工厂模式**是...
在C#中,我们通常通过私有化构造函数和静态方法来实现单例,确保任何时候都只有一个对象存在。单例常用于控制资源的访问,如数据库连接池、日志服务等。C#的`Lazy<T>`类和`Singleton<T>`模式可以帮助我们实现线程...
### 最简单的设计模式...通过私有构造函数、静态成员变量和静态工厂方法的组合使用,可以轻松地在Java和C++等语言中实现Singleton模式。同时,在多线程环境下,需要特别注意线程安全问题,采取相应的措施确保单例性。
单例可以通过私有构造函数和静态方法来实现,以防止多实例化。 结合这些概念,DEMO可能会展示如何在ASP.NET C#项目中创建一个工厂类来生成产品对象,这些对象可能是基于抽象类的,允许在子类中实现具体逻辑。同时,...
在这个主题中,我们将深入探讨"设计模式_C#",特别是与私有构造函数相关的知识。 首先,私有构造函数(Private Constructor)是类的一个特殊方法,用于初始化对象。当一个类的构造函数被声明为私有时,外部代码无法...
在Java中,可以通过私有构造函数、静态工厂方法和双重检查锁定等方式实现单例。 **内存池** 内存池是一种内存管理策略,它预先分配一大块内存,然后根据需要从中划分出小块内存供对象使用。这样可以避免频繁的内存...
在`myFactoryDemo`中,可能会有一个单例类,如`SingletonDemo`,它通过私有构造函数防止外部直接创建实例,并提供一个静态方法或静态变量来获取唯一实例。例如: ```java public class SingletonDemo { private ...
在Java中,通常通过私有构造函数和静态工厂方法来实现单例,确保类无法被多次实例化。同时,为了线程安全,可以使用双重检查锁定(Double-Checked Locking)或者静态内部类的方式进行优化。 结合工厂单例模式,我们...
Singleton() {} // 私有构造函数 Singleton(const Singleton&) = delete; // 禁止复制构造 Singleton& operator=(const Singleton&) = delete; // 禁止赋值操作 static void initSingleton() { instance = new...
在Java中,通常通过私有构造函数和静态方法来实现。单例模式常用于资源管理,如数据库连接池、线程池等,因为这些场景下创建过多实例会浪费资源且不利于管理。 **3. 代理模式** 代理模式为其他对象提供一种代理以...
1. **私有化构造函数**:单例类的构造函数被声明为私有的,防止外部直接通过 `new` 关键字实例化对象。 ```php class Singleton { private function __construct() {} } ``` 2. **静态实例变量**:在类内部定义一...
在Java中,通常通过私有构造函数和静态工厂方法实现单例。此外,还有支持多个实例的多例模式,但它们通常比单例更复杂,需要考虑线程安全问题。 DAO(Data Access Object)模式是为了解耦业务层和数据源,将数据...
- **单例模式**:实现一个`Singleton`类,通过私有构造函数确保不能直接实例化,提供一个静态方法`getInstance()`返回唯一的实例。 - **工厂模式**:定义一个`VehicleFactory`接口,包含生产车辆的方法,然后创建`...
在Java中,通常通过私有构造函数和静态方法来实现单例。常见的单例实现方式有懒汉式(lazy initialization)、饿汉式(eager initialization)和双重检查锁定(double-checked locking)。这些实现方式各有优缺点,...
通过阅读和理解这些文件,我们可以学习到如何在C++中应用工厂模式,以及如何利用私有构造函数来实现工厂方法,以控制对象的创建。这对于我们理解和实践面向对象设计原则,尤其是开闭原则(对扩展开放,对修改关闭)...