标题:突然想到一个问题,和大家一起分享
只看楼主
神vLinux飘飘
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:浙江杭州
等 级:贵宾
威 望:91
帖 子:6140
专家分:217
注 册:2004-7-17
 问题点数:0 回复次数:30 
突然想到一个问题,和大家一起分享
不知道大家在写类的时候,有没有碰到要给父类的构造函数传递参数的情景。估计碰到的会对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;
}

}

好,现在准备出问题了,如果我要派生一个子类 UserDataStore,拥有如下的构造方法

public UserDataStore( String username, String password ) {
//super(...);
}

请问,如果是让你写UserDataStore类,你是如何用最小的代价,把
<"username",username>
<"password",password>
这两对键值导入到 DataStore 的 datas 中去呢?


大家发挥下自己的想象力~~~嘻嘻
搜索更多相关主题的帖子: 数据库 super java 数据存储 class 
2007-06-21 22:39
千里冰封
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:灌水之王
等 级:版主
威 望:155
帖 子:28477
专家分:59
注 册:2006-2-26
得分:0 
你是怎么 解决的?

可惜不是你,陪我到最后
2007-06-21 22:54
神vLinux飘飘
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:浙江杭州
等 级:贵宾
威 望:91
帖 子:6140
专家分:217
注 册:2004-7-17
得分:0 
让大家想想啊,那么早说就没意思了

淘宝杜琨
2007-06-21 23:15
千里冰封
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:灌水之王
等 级:版主
威 望:155
帖 子:28477
专家分:59
注 册:2006-2-26
得分:0 
我 日哦

可惜不是你,陪我到最后
2007-06-21 23:54
神vLinux飘飘
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:浙江杭州
等 级:贵宾
威 望:91
帖 子:6140
专家分:217
注 册:2004-7-17
得分:0 
快想

淘宝杜琨
2007-06-22 00:09
Eastsun
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:32
帖 子:802
专家分:0
注 册:2006-12-14
得分:0 
写个方法,让它执行生成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));
}
}

My BlogClick Me
2007-06-22 04:20
神vLinux飘飘
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:浙江杭州
等 级:贵宾
威 望:91
帖 子:6140
专家分:217
注 册:2004-7-17
得分:0 
恩,解决是解决了,但是显得不够优美,还必须得写一个私有静态的帮助方法
而且如果UserDataStore构造函数接受的参数需要改变,帮助方法需要改变的地方比较多,而且容易忘记调整该方法以适应新的构造函数

或者如果UserDataStore又有一个构造函数如下

public UserDataStore( UserInfo userInfo );

那你还必须得为该构造方法重写一个帮助类,显得太不雅观~

[此贴子已经被作者于2007-6-22 7:54:20编辑过]


淘宝杜琨
2007-06-22 07:09
神vLinux飘飘
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:浙江杭州
等 级:贵宾
威 望:91
帖 子:6140
专家分:217
注 册:2004-7-17
得分:0 
回复:(神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());
}

}

[此贴子已经被作者于2007-6-22 7:28:09编辑过]


淘宝杜琨
2007-06-22 07:25
神vLinux飘飘
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:浙江杭州
等 级:贵宾
威 望:91
帖 子:6140
专家分:217
注 册:2004-7-17
得分:0 
回复:(神vLinux飘飘)突然想到一个问题,和大家一起...
这个方法有个局限性,就是必须要求在HashMap这个位置的类必须要能被继承

也就是说,如果HashMap是final类(我是说如果,我知道HashMap不是final类),那么像Eastsun那样创建一个帮助类则是一个不错的选择。

淘宝杜琨
2007-06-22 08:07
千里冰封
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:灌水之王
等 级:版主
威 望:155
帖 子:28477
专家分:59
注 册:2006-2-26
得分:0 
楼上的同志们,你们太牛了

可惜不是你,陪我到最后
2007-06-22 10:01



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-149373-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.183786 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved