突然想到一个问题,和大家一起分享
不知道大家在写类的时候,有没有碰到要给父类的构造函数传递参数的情景。估计碰到的会对super([参数列表])这样的构造形式有所见识吧。<
br>现在有一个问题是这样的:众所周知,super()和this()都必须出现在构造函数的第一行,但是,如果我要在 super()或者this()之前为他们的参数写点初始化代码就显得不好办了。
例如,现有一个数据存储类用来 模拟简单的数据库
import java.util.Map;
/**
* 数据存储类
* @author vlinux
*/
public class DataStore {
private Map<String,String> valueMap; //键值对应MAP
/**
* 根据键名获取值
* @param name 键名
* @return 对应的值
*/
public String getValue( String name ) {
return valueMap.get(name);
}
/**
* 设置键名对应MAP
* @param valueMap
*/
public DataStore( Map<String,String> valueMap ) {
this.valueMap = valueMap;
}
}
/**
* 数据存储类
* @author vlinux
*/
public class DataStore {
private Map<String,String> valueMap; //键值对应MAP
/**
* 根据键名获取值
* @param name 键名
* @return 对应的值
*/
public String getValue( String name ) {
return valueMap.get(name);
}
/**
* 设置键名对应MAP
* @param valueMap
*/
public DataStore( Map<String,String> valueMap ) {
this.valueMap = valueMap;
}
}
好,现在准备出问题了,如果我要派生一个子类 UserDataStore,拥有如下的构造方法
public UserDataStore( String username, String password ) {
//super(...);
}
//super(...);
}
请问,如果是让你写UserDataStore类,你是如何用最小的代价,把
<"username",username>
<"password",password>
这两对键值导入到 DataStore 的 datas 中去呢?
大家发挥下自己的想象力~~~嘻嘻
----------------解决方案--------------------------------------------------------
你是怎么 解决的?
----------------解决方案--------------------------------------------------------
让大家想想啊,那么早说就没意思了
----------------解决方案--------------------------------------------------------
我 日哦
----------------解决方案--------------------------------------------------------
快想
----------------解决方案--------------------------------------------------------
写个方法,让它执行生成Map的过程不久OK了.
程序代码:
public class UserDataStore extends DataStore{
private static Map<String,String> createMap(String username,String password){
Map<String,String> map =new HashMap<String,String>();
map.put(\"username\",username);
map.put(\"password\",password);
return map;
}
public UserDataStore(String username,String password){
super(createMap(username,password));
}
}
----------------解决方案--------------------------------------------------------
恩,解决是解决了,但是显得不够优美,还必须得写一个私有静态的帮助方法
而且如果UserDataStore构造函数接受的参数需要改变,帮助方法需要改变的地方比较多,而且容易忘记调整该方法以适应新的构造函数
或者如果UserDataStore又有一个构造函数如下
public UserDataStore( UserInfo userInfo );
那你还必须得为该构造方法重写一个帮助类,显得太不雅观~
[此贴子已经被作者于2007-6-22 7:54:20编辑过]
----------------解决方案--------------------------------------------------------
回复:(神vLinux飘飘)突然想到一个问题,和大家一起...
这是我原创的解决方法,自认为解决的不错,欢迎大家批驳构造一个匿名内部类继承HashMap,在里面添加一个私有方法
private HashMap<String,String> init();
返回它自己本身的引用,做成方法链的形式。
这样可在创建完该匿名内部类后立即调用init()方法进行初始化
/**
* UserDataStore
* @author vlinux
*/
public class UserDataStore extends DataStore {
/**
* UserDataStore
* @param username
* @param password
*/
public UserDataStore( final String username, final String password ) {
/**
* 构造一个匿名内部类,继承HashMap,在里面添加一个私有方法
* private HashMap<String,String>();
* 返回它自己本身的引用,做成方法链的形式。这样可在创建完该匿名内部类后立即调用init()方法进行初始化
*/
super( new HashMap<String,String>(){
private HashMap<String,String> init(){
put( "username", username );
put( "password", password );
return this;
}
}.init());
}
}
* UserDataStore
* @author vlinux
*/
public class UserDataStore extends DataStore {
/**
* UserDataStore
* @param username
* @param password
*/
public UserDataStore( final String username, final String password ) {
/**
* 构造一个匿名内部类,继承HashMap,在里面添加一个私有方法
* private HashMap<String,String>();
* 返回它自己本身的引用,做成方法链的形式。这样可在创建完该匿名内部类后立即调用init()方法进行初始化
*/
super( new HashMap<String,String>(){
private HashMap<String,String> init(){
put( "username", username );
put( "password", password );
return this;
}
}.init());
}
}
[此贴子已经被作者于2007-6-22 7:28:09编辑过]
----------------解决方案--------------------------------------------------------
回复:(神vLinux飘飘)突然想到一个问题,和大家一起...
这个方法有个局限性,就是必须要求在HashMap这个位置的类必须要能被继承也就是说,如果HashMap是final类(我是说如果,我知道HashMap不是final类),那么像Eastsun那样创建一个帮助类则是一个不错的选择。
----------------解决方案--------------------------------------------------------
楼上的同志们,你们太牛了
----------------解决方案--------------------------------------------------------