失败的产品PropertySet
不错的想法,失败的产品——PropertySet
PropertySet确实是个好东西,至于有多好我就不说了,自己去看吧。
不过,PropertySet确实让我很恼火。我做了一个晚上的实验都没有成功,结果问题却出在它的源代码里!且听我慢慢说来。
我做了一个最简单的例子,有多简单呢?看看配置文件就知道:
<propertysets>
<propertyset name="myBean" class="testLab.MyBean">
<arg name="myInt" value="57"/>
<arg name="myString" value="na57"/>
</propertyset>
</propertysets>
做这个例子只是为了从配置文件里面读出我所需要的值。我的测试代码如下:
PropertySet ps = PropertySetManager.getInstance("myBean",null);
System.out.print(ps.getString("myString"));
Assert.assertEquals("na57",ps.getString("myString"));
结果失败了,失败在哪里?我在保证了我的代码万无一失的情况下,去看PropertySet的代码,我使用的PropertySet接口实现是MemoryPropertySet类,于是我就先找到了这个类读数据的代码:
public String getString(String key) {
try {
return (String) get(STRING, key);
} catch (NullPointerException e) {
return null;
}
}
接着是get方法:
protected synchronized Object get(int type, String key) throws InvalidPropertyTypeException {
if (exists(key)) {
ValueEntry v = (ValueEntry) getMap().get(key);
if (v.type != type) {
throw new InvalidPropertyTypeException();
}
return v.value;
} else {
return null;
}
}
再后来就是getMap()方法了:
protected HashMap getMap() {
return map;
}
到这里都没什么问题,接下来要看map在什么地方被赋值了,map是MemoryPropertySet类的私有字段,自然是不会在MemoryPropertySet的基类里赋值了,但是,在MemoryPropertySet类里面,对map的赋值操作只有一个地方:
public void init(Map config, Map args) {
map = new HashMap();
}
剩下就不说了,map里面根本什么也没有,晕死~~~