锁定老帖子 主题:代码重构时的一个想法
该帖已经被评为隐藏帖
|
|
---|---|
作者 | 正文 |
发表时间:2010-06-29
最后修改:2010-06-29
一般,都是根据类名.getSingletonInstance()就可以获取单例对象。 先看下面代码: package boke.test; /** * 单列 * * @since jdk1.5及其以上 * @author 毛正吉 * @version 1.0 * @date 2010.06.29 * */ class Singleton { private static final Singleton singleton = new Singleton(); /** * 私有构造 */ private Singleton() { } /** * 获得单例实例 * @return */ public static Singleton getInstance() { return singleton; } /** * 其他方法 */ public void doSomething() { System.out.println("doSomething..."); } } ------------------------ package boke.test; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; /** * 测试例子 * @author 毛正吉 * */ public class Client { /** * @param args * @throws ClassNotFoundException * @throws IllegalAccessException * @throws InstantiationException * @throws NoSuchMethodException * @throws SecurityException * @throws InvocationTargetException * @throws IllegalArgumentException */ public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, SecurityException, NoSuchMethodException, IllegalArgumentException, InvocationTargetException { Class cls = Class.forName("boke.test.Singleton"); System.out.println(cls.getName()); Method method = cls.getDeclaredMethod("doSomething", new Class[]{}); method.invoke(Singleton.getInstance(), null); method.invoke(cls.newInstance(), null); // 该方法有问题 } } 很容易发现注释部分由问题,不能访问单例类,因为构造方法为private修饰。 现在,有这样一个方法,我们暂不考虑这样做有没有意义,能否通过方法中传入的类名字符串来获取该类的唯一实例呢?或者不能实现? public Singleton getSingletonInstance(String className) { ... return 单例对象 } 仅此想法,欢迎大家讨论哈。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-06-29
Method mGetInstance = cls.getDeclaredMethod("getInstance", new Class[]{});
mGetInstance.invoke(null, new Object[]{}); 没编译 |
|
返回顶楼 | |
发表时间:2010-06-29
看这样行不行,覆盖clone方法,用它返回一个单例,然后用
return Class.forName("类名").clone(); |
|
返回顶楼 | |
发表时间:2010-06-29
Spring楼主没有用过吗,
|
|
返回顶楼 | |
发表时间:2010-06-29
little_shieh 写道 Spring楼主没有用过吗,
spring的singleton与java的singleton不是一样东西. |
|
返回顶楼 | |
发表时间:2010-06-29
抛出异常的爱 写道 little_shieh 写道 Spring楼主没有用过吗,
spring的singleton与java的singleton不是一样东西. 如果在配置中指定初始化方法为getInstance应该就一样了。 否则只是容器中单例,实际jvm中还可以存在其它实例 |
|
返回顶楼 | |
发表时间:2010-06-29
1.把所有可能传进来的数做成单例模式,即构造哭私有化,一个 pubic static getInstance(){return this.instance;}.
2.在工厂方法里Class.forname(classname).getInstance() interface singletonable<T>{ T getInstance(T t) } |
|
返回顶楼 | |
发表时间:2010-06-29
有必要这么做吗?或许你该更深入的了解单例模式
|
|
返回顶楼 | |
发表时间:2010-06-30
完全没必要这样用,非常规!
|
|
返回顶楼 | |
发表时间:2010-06-30
huzhenyu 写道 完全没必要这样用,非常规! 仅此想法 非常规好事 |
|
返回顶楼 | |