黑马程序员技术交流社区
标题:
关于单例和static的一个小疑问
[打印本页]
作者:
刘笑
时间:
2012-6-29 19:18
标题:
关于单例和static的一个小疑问
最近在学习单例,觉得单例貌似和static没有啥太大区别啊,各位大侠别笑我
比如对于一个UserManager类,若用单例的方式来实现:
class UserManager {
private static UserManager instance = new UserManager();
private UserManager() {}
public static UserManager getInstance() {
return instance;
}
public void addUser(User user) {...}
public void delUser(int id) {...}
}
如果把它的方法都定义为static的:
class UserManager {
private UserManager() {}
public static void addUser(User user) {...}
public static void delUser(int id) {...}
}
请问各位,这两种方法到底有什么异同,用哪个比较好?
作者:
whocases
时间:
2012-6-29 19:35
单例模式就是创建一个类的实例, static方式不会创建任何实例,它只是把类加载到内存,如果管理一些状态,对象什么的,就用单例模式 ;如果你只是提供一个通用方法的话,就用static的方式
class UserManager {
private static UserManager instance = new UserManager();
private UserManager() {}
public static UserManager getInstance() {
return instance;
}
public void addUser(User user) {...}
public void delUser(int id) {...}
}
这段代码是单例模式,单例就是把构造方法私有化,这段代码通过调用getInstance返回UserManager的实例,而static就是不创建任何对象前提下,仅通过类本身调用static方法.跟对象没有任何关系.
class UserManager {
private UserManager() {}
public static void addUser(User user) {...}
public static void delUser(int id) {...}
}
这段代码跟单例没有一毛钱关系,呵呵,只是把构造方法私有而己,另还外多了两个static方法..
作者:
黄克帅
时间:
2012-6-29 20:10
最近在学习单例,觉得单例貌似和static没有啥太大区别啊,
单例和static要有什么区别? 他们根本都没有关系。
只是在实现单例的时候,为了防止别人创建对象,就把构造方法私有化,然后只能通过类名.方法名的方式调用指定方法获得 对象。 因此必须在此方法前面加static,而静态方法又只能调用静态属性,所以在属性前面也要加static。 这样无论你怎么都是创建同一个对象
至于你后面那个类,根本都无法获得对象 。与单例没有一点关系
作者:
周刚
时间:
2012-6-29 20:12
开始我以为会有问题,我做了如下测试:
public class Test2 {
public static void main(String[] args)
User user = new User();
user.setName("bbb");
UserManager.addUser(user);
}
}
class UserManager {
private UserManager() {
}
public static void addUser(User user) {
System.out.println(user.getName());
}
public static void delUser(int id) {
}
}
class User {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
结果发现没问题,才开始觉得楼主这个问题问得非常好。两种方法在实现效果上的确没有什么区别。
但思想上有些区别:单例模式毕竟是创建了一个对象,调用方法是通过对象调用;而后者则直接是用类调用。
作者:
黑马罗坚
时间:
2012-6-29 23:47
思想是一个方面 还有创建对象能更好的传递 和调用 假如有一个方法要运行传进的对象的某个方法 单列模式可以直接传对象过去 而你的工具类把构造方法私有化了传什么进去了 难道通过反射调用
作者:
吴琼
时间:
2012-6-29 23:54
方法的调用都是可以的.但是意义不同.单例是通过对象调用方法.static是直接就通过类名调用的.
还有static是随着类的加载而加载的.生命周期会很长.这样会很占内存.一般情况不建议使用static.
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2