`

代码重构时的一个想法

 
阅读更多
   最近,在对以前的代码进行重构时,发现了这么一个问题,对于一个单例,在一个方法中传入该类的名字,如何根据这个名字获取该类的实例?
一般,都是根据类名.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 单例对象
}


仅此想法,欢迎大家讨论哈。
分享到:
评论
13 楼 littleJava 2010-06-30  
spring的单例是通过ThreadLocal来保证线程的同步,普通的singleton有可能不提供这个功能

楼主能介绍下 你们代码重构的标准和规范吗?
12 楼 moonranger 2010-06-30  
risemanjavaeye 写道
1.把所有可能传进来的数做成单例模式,即构造哭私有化,一个 pubic static getInstance(){return this.instance;}.
2.在工厂方法里Class.forname(classname).getInstance()

interface singletonable<T>{
T getInstance(T t)
}


pubic static getInstance(){return this.instance;}
static方法你如何引用this?看你下面那个接口,这个static是多余的吧?

莫非是单例都要实现这个接口?那就很有意思了,没有实例的前提下,你如何调用这个getInstance?

Class.forname(classname).getInstance(),这句话也有问题吧?Class.forName(className)得到的是一个Class对象,上面哪来的getInstance()方法?
11 楼 moonranger 2010-06-30  
越来越不倾向于使用这样的单例,没法mock,不利于Unit test。个人认为Spring等DI容器管理的单例比较合适。
10 楼 maozj 2010-06-30  
risemanjavaeye 写道
1.把所有可能传进来的数做成单例模式,即构造哭私有化,一个 pubic static getInstance(){return this.instance;}.
2.在工厂方法里Class.forname(classname).getInstance()

interface singletonable<T>{
T getInstance(T t)
}

----------------------
泛型 这个想法不错
9 楼 maozj 2010-06-30  
huzhenyu 写道
完全没必要这样用,非常规!

仅此想法 非常规好事
8 楼 huzhenyu 2010-06-30  
完全没必要这样用,非常规!
7 楼 uran 2010-06-29  
有必要这么做吗?或许你该更深入的了解单例模式
6 楼 risemanjavaeye 2010-06-29  
1.把所有可能传进来的数做成单例模式,即构造哭私有化,一个 pubic static getInstance(){return this.instance;}.
2.在工厂方法里Class.forname(classname).getInstance()

interface singletonable<T>{
T getInstance(T t)
}
5 楼 lydawen 2010-06-29  
抛出异常的爱 写道
little_shieh 写道
Spring楼主没有用过吗,

spring的singleton与java的singleton不是一样东西.


如果在配置中指定初始化方法为getInstance应该就一样了。
否则只是容器中单例,实际jvm中还可以存在其它实例
4 楼 抛出异常的爱 2010-06-29  
little_shieh 写道
Spring楼主没有用过吗,

spring的singleton与java的singleton不是一样东西.
3 楼 little_shieh 2010-06-29  
Spring楼主没有用过吗,
2 楼 exloong 2010-06-29  
看这样行不行,覆盖clone方法,用它返回一个单例,然后用

return Class.forName("类名").clone();
1 楼 deadcode 2010-06-29  
Method mGetInstance = cls.getDeclaredMethod("getInstance", new Class[]{});
mGetInstance.invoke(null, new Object[]{});

没编译

相关推荐

    重构-改善既有代码的设计

    于是萌生想做一本重构工具书的想法,本来打算自己重新将重构书的内容再整理归类一下,后来发现原书的目录编排就很适合做工具书,包括坏味道分类,重构手法归类等,都有了一个比较系统的整理。因此,我利用空余时间...

    (原创)重构-改善既有代码的设计 chm 中文版

    于是萌生想做一本重构工具书的想法,本来打算自己重新将重构书的内容再整理归类一下,后来发现原书的目录编排就很适合做工具书,包括坏味道分类,重构手法归类等,都有了一个比较系统的整理。因此,我利用空余时间...

    代码和架构如何重构:漫谈重构技巧

    程序员们为了快速完成需求和上线而写出了最基  因为工作内容的原因,我在前后两家公司中的工作中主持和经历了十余次代码和架构的重构,下面随便说说我对重构的一些经验和想法。  关于重构  首先重构面临的背景都...

    重构Python代码的六个实例

    小编整理了介绍python代码重构优化的一些方法,助你一臂之力。 编写干净的 Pythonic 代码就是尽可能使其易于理解,但又简洁。所以重构代码让代码简洁易理解是很有必要的。 本文重点是想跟大家探讨为什么这些重构是好...

    (原创)重构-改善既有代码的设计 chm中文版

    于是萌生想做一本重构工具书的想法,本来打算自己重新将重构书的内容再整理归类一下,后来发现原书的目录编排就很适合做工具书,包括坏味道分类,重构手法归类等,都有了一个比较系统的整理。因此,我利用空余时间...

    设计模式 模版方法模式 设计思想 演过过程 重构过程

    模版方法模式定义了一个操作中的算法骨架,而将一些步骤延迟到子类中。这使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 **设计思想**: 1. **开放封闭原则(Open-Closed Principle)**:软件...

    01-code_refactor:作业01-代码重构

    作业01-代码重构 描述:社会解决方案服务公司Horiseon要求对其网站进行更新,以满足可访问性合规性要求。 在使页面可访问性符合标准并遵循“侦察规则”的同时,我使用更新的标签更新了编码的语义,清理了空格以及...

    PerCM个人代码管理软件

    如果简化成为这样一个状态,perCDM不但可以搜索代码,而且可以同时搜索输入的文档(甚至文档就写作在其中),我想可以首先从简单的模式去实现,这是一个我需要的模式。 3、文档模式,对apose进行了初步的分析。这个...

    我的自动化测试程序

    但是重构有一个问题,就是如何保证重构后带代码实现的功能与重构前的一致,如果每次重构完成后,对此不闻不问,则会有极大的风险,如果每次重构后,都进行一边测试,则工作量会很巨大,最终可能是即使代码有重构的...

    美丽的代码

    这本书的内容以及提供的资源信息,都指向了一个明确的目标:那就是提高程序员的技能,增加其对代码质量的关注,并鼓励他们在日常工作中追求更高的代码美学。通过分享优秀编码实践,书籍和相关资源可以帮助开发者建立...

    开源项目-lmas-labassistant.zip

    开源项目“lmas-labassistant”是一个基于Go语言编写的代码重构工具库,旨在帮助开发者更高效、系统地进行代码优化和改进。这个项目的名字"LMA"可能代表“Lab Assistant”,暗示它是一个辅助实验室环境或者开发过程...

    js2-refactor.el:用于emacsJavaScript重构库

    这是一些小的重构函数的集合,用于进一步增强以js2-mode开头的Emacs中JavaScript IDE的想法。 更改0.8.0 根据点的节点类型(数组,对象,函数,调用args),将expand-node-at-point和contract-node-at-point函数...

    高效程序员的45个习惯-读书笔记

    文章共分五个部分,分别讨论了敏捷开发、代码重构、角色定义、问题解决和团队协作等方面的知识点。 一、敏捷开发之道 文章首先谈到了敏捷开发的重要性,强调了在开发过程中需要不断地进行测试、集成、展示demo、...

    TalkTerminal代码备份

    10. **Code Lab**:这个名字暗示可能是一个实验性代码的集合,或者是用于学习或测试新想法的代码库。 总的来说,这个`TalkTerminal代码备份`涵盖了Python编程、PowerShell集成、项目管理和开发环境配置等多个方面。...

    有效提高编码质量之漫谈重构

    因为工作内容的原因,我在前后两家公司中的工作中主持和经历了十余次代码和架构的重构,下面随便说说我对重构的一些经验和想法。关于重构  因为工作内容的原因,我在前后两家公司中的工作中主持和经历了十余次代码...

    JS前端框架关于重构的失败经验分享

    好了开始吧 重构这个其实也不是什么大动作,主要要实现的功能嘛,就是把现有的JS代码重新划分一下,解耦现有模块。然后我打算把现有的程序划分一下模块然后重新打包做一个命名空间实现use或者类似于java的Package的...

    Kalman.Studio, 开发辅助工具,内置基于T4的代码生成器。.zip

    "Kalman.Studio" 是一个开发辅助工具,主要特色是它内建了一个基于T4(Text Template Transformation Toolkit)的代码生成器。这个工具旨在提高开发者的工作效率,通过自动生成代码来减少手动编写重复性工作的需求。...

    代码阅读方法与实践(中文版,Diomidis.Spinellis.著)

    《代码阅读方法与实践》是由Diomidis Spinellis编著的一本专为提升程序员代码阅读能力和技巧的书籍。在编程领域,理解并能够高效地阅读他人的代码是至关重要的,因为这不仅能帮助我们学习新的技术和设计模式,还能在...

Global site tag (gtag.js) - Google Analytics