在学习视频中,毕老师关于单例模式的饿汉式的代码结构如下:
class Single{
private Single(){}
private String name = "han";
private static Single single = new Single();
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public static Single getInstance()
{
return single;
}
}
我的问题是上段代码可不可以这样写
class Single{
private Single(){}
private String name = "han";
public static Single singleton = new Single();//把private权限改称,public ,这样在创建对象时可以Single s1 = Single.singleton
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
/*public static Single getInstance()//注视掉这个静态成员函数
{
return single;
}*/
}
如果想拿到该类的对象:
public static void main(String[] args)
{
Single s = Single.singleton;
System.out.println(s.getName());
Single s1 = Single.singleton;
s1.setName("hahahahah");
Single s3 = Single.singleton;
s3.setName("I'm s3");
System.out.println(s.getName());
}
打印结果为:han
I'm s3
所以这种方法貌似也可以,而且代码好像更简练,这样写可不可以? 作者: amen0205 时间: 2013-3-5 03:03
这个代码是没问题,但封装的特点就是把自身的属性和不必要的方法都封装起来,然后提供方法给外界调用,你这样做和把 name 非私有 给外界调用一样的性质。但封装存在的意义便是 隔离变化 、 便于使用、提高重用性、提高安全性。 还是不要这样做的好作者: 明锦添 时间: 2013-3-5 22:14
两种形式:
1,饿汉式单例类
public class Singleton {
private Singleton(){}
//在自己内部定义自己一个实例,是不是很奇怪?
//注意这是private 只供内部调用
private static Singleton instance = new Singleton();
//这里提供了一个供外部访问本class的静态方法,可以直接访问
public static Singleton getInstance() {
return instance;
}
}
2,懒汉式单例类
public class Singleton {
private static Singleton instance = null;
public static synchronized Singleton getInstance() {
//这个方法比上面有所改进,不用每次都进行生成对象,只是第一次
//使用时生成实例,提高了效率!
if (instance==null)
instance=new Singleton();
return instance; }
} 作者: 移动小坦克 时间: 2013-3-6 01:56
明锦添 发表于 2013-3-5 22:14
两种形式:
1,饿汉式单例类
public class Singleton {