黑马程序员技术交流社区

标题: 关于单例和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