A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘笑 中级黑马   /  2012-6-29 19:18  /  1902 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

最近在学习单例,觉得单例貌似和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) {...}
}

请问各位,这两种方法到底有什么异同,用哪个比较好?

评分

参与人数 1技术分 +1 收起 理由
刘蕴学 + 1 不少人当初都会这么想的

查看全部评分

5 个回复

倒序浏览
单例模式就是创建一个类的实例, 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方法..

评分

参与人数 1技术分 +1 收起 理由
刘蕴学 + 1

查看全部评分

回复 使用道具 举报
最近在学习单例,觉得单例貌似和static没有啥太大区别啊,
单例和static要有什么区别?  他们根本都没有关系。
只是在实现单例的时候,为了防止别人创建对象,就把构造方法私有化,然后只能通过类名.方法名的方式调用指定方法获得 对象。 因此必须在此方法前面加static,而静态方法又只能调用静态属性,所以在属性前面也要加static。 这样无论你怎么都是创建同一个对象

至于你后面那个类,根本都无法获得对象 。与单例没有一点关系
回复 使用道具 举报
开始我以为会有问题,我做了如下测试:
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;
        }
}
结果发现没问题,才开始觉得楼主这个问题问得非常好。两种方法在实现效果上的确没有什么区别。
但思想上有些区别:单例模式毕竟是创建了一个对象,调用方法是通过对象调用;而后者则直接是用类调用。

评分

参与人数 1技术分 +1 收起 理由
刘蕴学 + 1

查看全部评分

回复 使用道具 举报
思想是一个方面  还有创建对象能更好的传递 和调用  假如有一个方法要运行传进的对象的某个方法  单列模式可以直接传对象过去  而你的工具类把构造方法私有化了传什么进去了 难道通过反射调用
回复 使用道具 举报
方法的调用都是可以的.但是意义不同.单例是通过对象调用方法.static是直接就通过类名调用的.
还有static是随着类的加载而加载的.生命周期会很长.这样会很占内存.一般情况不建议使用static.
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马