论坛首页 Java企业应用论坛

JavaBean和FieldMap 静态定义和动态构建孰优孰劣?

浏览 12533 次
精华帖 (2) :: 良好帖 (0) :: 新手帖 (8) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-11-29   最后修改:2009-11-30
OO
我们来看一个JavaBean
class Bond{
private String id;
private String name;

public void setId(String id){
    this.id = id;
}

public String getId(){
    return this.id;
}

public void setName(String name){
    this.name = name;
}

public String getName(){
    return this.name;
}

然后我们来看看对应的FieldMap如何描述:
FieldMap fm = new FieldMap("Bond").putField("id","060001").putField("name","06国债01");

看起来FieldMap简洁许多,毕竟一个是静态定义一个是动态构建,一个强类型一个弱类型。
假设现在要为Bond这个类型加入发行价格和发行日期这两个属性,这时候定义JavaBean时我们将会陷入一个考量,定义什么类型,比如发行日期我们定义Date呢还是字符串?价格定义double呢还是字符串?对于拿日期来做计算或比较的,显然定义Date更合理,如果拿来是显示的显然某种格式的字符串更合适。无论你怎么定义在遇到不同场景时,必然要来回折腾转换,极为不便。
那FieldMap如何处理这样的问题呢?
假设某个Field是发行日期,它的name是iDate,像下面这样我们拿到的是什么?
fieldMap.getField("iDate").getValue();

答案是构造这个FieldMap时放的什么值就是什么值,比如有可能是yyyyMMdd格式的日期字符串,有可能是java的Date类型,如果你仅仅调用getValue(),那么你得到的是当初放的那个值,但是因为你知道这个Field叫iDate,里面的值一定是个日期,所以你有时候说我希望要拿Date,有时候希望要拿某种格式的字符串。因此你不仅仅可以调用Field的getValue(),你还可以这样:
fieldMap.getField("iDate").getDateValue();
fieldMap.getField("iDate").getDateStringValue();
fieldMap.getField("iDate").getDateStringValue("yyyy/MM/dd");

第一个你将直接拿到Date类型,第二个你将拿到yyyy-MM-dd格式的字符串,第三个你将拿到你自定义格式的日期字符串,比如这里就是yyyy/MM/dd。
很明显看到这里我们发现FieldMap灵活便利的多,因为即使对于同一个类型,它也有很多不同的形式。
   发表时间:2009-11-30  
我比较疑惑,怎么没人发表一些看法?
0 请登录后投票
   发表时间:2009-11-30  
请问FieldMap是指的那个
0 请登录后投票
   发表时间:2009-11-30  
evanerv0079 写道
请问FieldMap是指的那个

FieldMap是我自己定义的一个数据结构,这里要讨论的核心是当我要描述一个事物的时候,是采用静态定义的Bean呢还是动态构建的FieldMap。FieldMap显然要灵活的多。
0 请登录后投票
   发表时间:2009-11-30  
fieldMap.getField("iDate")
如果 iDate 是 MM/dd/yy 的格式字符串(02/03/09),
那fieldMap.getField("iDate").getDateStringValue("yyyy/MM/dd");会是怎样?
0 请登录后投票
   发表时间:2009-11-30  
icefire 写道
fieldMap.getField("iDate")
如果 iDate 是 MM/dd/yy 的格式字符串(02/03/09),
那fieldMap.getField("iDate").getDateStringValue("yyyy/MM/dd");会是怎样?

LS提的问题很好,这说明什么呢?说明使用FieldMap的双方还是要隐含着某种约定的,但是宽松多了,一方以他便利的方式塞Date,另一方以他便利的方式拿某种Date字符串格式,但是如果两方便利的都是字符串,而且还出现LS讲的情况,那么两方就不能各自独善其身。
0 请登录后投票
   发表时间:2009-11-30  
mock1234 写道
干脆什么field都规定只能是字符串!

干脆规定不允许多个field,任何对象只允许定义一个field存个xml值,然后再解析。

干脆别写软件,让小学生随便写写。我们都想伟大的事。至于是否会造成网络瘫痪、火车翻车、银行错账、心脏起搏器突然加快1000倍、所有程序都缓慢10万倍......无所谓,只要编程的人觉得有优势就成。

LS这段话我有些不解了,至于这么气急败坏吗?
0 请登录后投票
   发表时间:2009-11-30  
JavaBean也是可以动态构建的。Struts的动态Form就是动态构建的。使用的是Apache Commons的提供的工具类。
0 请登录后投票
   发表时间:2009-11-30   最后修改:2009-11-30
魔力猫咪 写道
JavaBean也是可以动态构建的。Struts的动态Form就是动态构建的。使用的是Apache Commons的提供的工具类。

但是还是有些差别,FieldMap中的Field定义了大量基本类型不同形式的便利方法。
除了上面的Date,还有比如对于数值类型的东西可以这样:
fieldMap.getField("amount").getNumberStringValue();
fieldMap.getField("amount").getNumberStringValue(2);
fieldMap.getField("amount").getDoubleValue();
fieldMap.getField("amount").getBigDecimalValue();
fieldMap.getField("amount").getIntValue();
0 请登录后投票
   发表时间:2009-11-30  
事实上我并不否定强类型也有它的好处,但是如果一个软件和另一个软件通信,通信数据结构这样定义会灵活方便很多。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics