论坛首页 Java企业应用论坛

关于JAVA单例模式

浏览 52915 次
精华帖 (1) :: 良好帖 (2) :: 新手帖 (7) :: 隐藏帖 (12)
作者 正文
   发表时间:2012-03-17  
freish 写道
xuehua1987 写道
wumingshi 写道
在多线程环境下有可能出现2个实例的情况。如果占用资源不大,可以直接在声明处创建,利用类加载的线程安全来保证;否则需要做一个sync。

另外,不要再用 if(null==smothing),应该if(something==null),这是几百年前的做法了,现代的编译器已经可以探测这样的错误了。



在表准的编程规范中应该是if(null==smothing)才正确
因为这样在程序中就可以避免空指针异常。

Object smothing = null
if(smothing == null) {
//
}

上面的代码会空指针?扯淡



   String str = null;
   System.out.println(str.equals("")); //亲。这亲会报空指针吗?
   System.out.println("".equals(str)); //呐又这样呢?


0 请登录后投票
   发表时间:2012-03-17  
给你看看吧。希望能帮上。
public final class DataSourceUtil {
private static DataSource dataSource;
static {
initDataSource();
}
/**
* 初始化数据源
* @throws ExceptionInInitializerError
*/
private static void initDataSource() throws ExceptionInInitializerError {
try {
Context context = new InitialContext();
dataSource = (DataSource) context.lookup("java:/comp/env/jdbc/mysql");
} catch (NamingException e) {
throw new ExceptionInInitializerError(e);
}
}
/**
* 获得数据源
* @return
*/
public static DataSource getDataSource() {
if (null == dataSource) {
synchronized(dataSource) {
if (null == dataSource) initDataSource();
}
}
return dataSource;
}

private DataSourceUtil() {}
}
0 请登录后投票
   发表时间:2012-03-18  
jdk 1.5 以后, 使用enum最方便啦
public enum Singleton{
  INSTANCE;
  //biz implements...
  //biz codes..
  public static Singleton getInstance(){
    return INSTANCE;
  }
}
0 请登录后投票
   发表时间:2012-03-18  
洪帮主 写道
给你看看吧。希望能帮上。
public final class DataSourceUtil {
private static DataSource dataSource;
static {
initDataSource();
}
/**
* 初始化数据源
* @throws ExceptionInInitializerError
*/
private static void initDataSource() throws ExceptionInInitializerError {
try {
Context context = new InitialContext();
dataSource = (DataSource) context.lookup("java:/comp/env/jdbc/mysql");
} catch (NamingException e) {
throw new ExceptionInInitializerError(e);
}
}
/**
* 获得数据源
* @return
*/
public static DataSource getDataSource() {
if (null == dataSource) {
synchronized(dataSource) {
if (null == dataSource) initDataSource();
}
}
return dataSource;
}

private DataSourceUtil() {}
}





equals 只是比较值是否相同
而==则是比较两个变量 是不是同一个变量,也应时是说
要看看这两个变量是不是引用的同一个地址,
java 中只有引用地址相同的两个变量才被视为==
如果明白值传递与地址传递的话,这个问题应该不难理解

null放在前面就是为了避免变量为空时 引了空指针异常
如: if(a==null) 如果a 真为空时,现在就相当用调用了变量a的方法,a 都为空了还调用他的方法,当然会引发空指针异常了,但写成if(null==a)就不会了
0 请登录后投票
   发表时间:2012-03-18  
Fkron 写道
freish 写道
xuehua1987 写道
wumingshi 写道
在多线程环境下有可能出现2个实例的情况。如果占用资源不大,可以直接在声明处创建,利用类加载的线程安全来保证;否则需要做一个sync。

另外,不要再用 if(null==smothing),应该if(something==null),这是几百年前的做法了,现代的编译器已经可以探测这样的错误了。



在表准的编程规范中应该是if(null==smothing)才正确
因为这样在程序中就可以避免空指针异常。

Object smothing = null
if(smothing == null) {
//
}

上面的代码会空指针?扯淡



   String str = null;
   System.out.println(str.equals("")); //亲。这亲会报空指针吗?
   System.out.println("".equals(str)); //呐又这样呢?





equals 只是比较值是否相同
而==则是比较两个变量 是不是同一个变量,也应时是说
要看看这两个变量是不是引用的同一个地址,
java 中只有引用地址相同的两个变量才被视为==
如果明白值传递与地址传递的话,这个问题应该不难理解

null放在前面就是为了避免变量为空时 引了空指针异常
如: if(a==null) 如果a 真为空时,现在就相当用调用了变量a的方法,a 都为空了还调用他的方法,当然会引发空指针异常了,但写成if(null==a)就不会了.


亲,这个问题要深层次的理解,要在程序运行时才可能出现的,你都一个变量显示的赋值了,当然不是空指针了.
0 请登录后投票
   发表时间:2012-03-18  
double check 也不是很靠谱,
现在我的做法都是,直接new 初始化
另外,楼主的写法确实有问题
每次return一个新实例,还能算是单例吗
0 请登录后投票
   发表时间:2012-03-18  
string2020 写道
构造函数没有私有化。

同意,构造函数如果没有私有化的话,外部就可以通过构造函数来new对象,使得静态方法不是创造对象的唯一途径
0 请登录后投票
   发表时间:2012-03-18  
xuehua1987 写道
Fkron 写道
freish 写道
xuehua1987 写道
wumingshi 写道
在多线程环境下有可能出现2个实例的情况。如果占用资源不大,可以直接在声明处创建,利用类加载的线程安全来保证;否则需要做一个sync。

另外,不要再用 if(null==smothing),应该if(something==null),这是几百年前的做法了,现代的编译器已经可以探测这样的错误了。



在表准的编程规范中应该是if(null==smothing)才正确
因为这样在程序中就可以避免空指针异常。

Object smothing = null
if(smothing == null) {
//
}

上面的代码会空指针?扯淡



   String str = null;
   System.out.println(str.equals("")); //亲。这亲会报空指针吗?
   System.out.println("".equals(str)); //呐又这样呢?





equals 只是比较值是否相同
而==则是比较两个变量 是不是同一个变量,也应时是说
要看看这两个变量是不是引用的同一个地址,
java 中只有引用地址相同的两个变量才被视为==
如果明白值传递与地址传递的话,这个问题应该不难理解

null放在前面就是为了避免变量为空时 引了空指针异常
如: if(a==null) 如果a 真为空时,现在就相当用调用了变量a的方法,a 都为空了还调用他的方法,当然会引发空指针异常了,但写成if(null==a)就不会了.


亲,这个问题要深层次的理解,要在程序运行时才可能出现的,你都一个变量显示的赋值了,当然不是空指针了.




我自叹对不起我的小学语文老师。


明明开始说的并且一直说的都是 if(a==null)的问题,这与调用a上面的方法有毛线关系啊
0 请登录后投票
   发表时间:2012-03-18  
多线程下可采用类加载程序,因为内部类只被加载一次,所以只会创建一个对象。
《设计模式解析-第二版》第21章有详细介绍
public class Singleton {
	private static class Instance {
		static final Singleton instance = new Singleton();
	}

	private Singleton() {
	}

	public static Singleton getInstance() {
		return Instance.instance;
	}
}
0 请登录后投票
   发表时间:2012-03-18  
freish 写道
xuehua1987 写道
Fkron 写道
freish 写道
xuehua1987 写道
wumingshi 写道
在多线程环境下有可能出现2个实例的情况。如果占用资源不大,可以直接在声明处创建,利用类加载的线程安全来保证;否则需要做一个sync。

另外,不要再用 if(null==smothing),应该if(something==null),这是几百年前的做法了,现代的编译器已经可以探测这样的错误了。



在表准的编程规范中应该是if(null==smothing)才正确
因为这样在程序中就可以避免空指针异常。

Object smothing = null
if(smothing == null) {
//
}

上面的代码会空指针?扯淡



   String str = null;
   System.out.println(str.equals("")); //亲。这亲会报空指针吗?
   System.out.println("".equals(str)); //呐又这样呢?





equals 只是比较值是否相同
而==则是比较两个变量 是不是同一个变量,也应时是说
要看看这两个变量是不是引用的同一个地址,
java 中只有引用地址相同的两个变量才被视为==
如果明白值传递与地址传递的话,这个问题应该不难理解

null放在前面就是为了避免变量为空时 引了空指针异常
如: if(a==null) 如果a 真为空时,现在就相当用调用了变量a的方法,a 都为空了还调用他的方法,当然会引发空指针异常了,但写成if(null==a)就不会了.


亲,这个问题要深层次的理解,要在程序运行时才可能出现的,你都一个变量显示的赋值了,当然不是空指针了.




我自叹对不起我的小学语文老师。


明明开始说的并且一直说的都是 if(a==null)的问题,这与调用a上面的方法有毛线关系啊



if(a==null)调用了a的方法?

Integer a = null;//这样赋值了就不是空指针了?
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics