分享
 
 
 

Java语言的缺陷(一)

王朝java/jsp·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

不可否认java是一门优秀的语言,但它的设计在一些方面作的不够好,下面我们对关于函数参数和返回值的一些问题进行探讨。

这是《effective Java》中的一个例子

public final class Period {

private final Date start;

private final Date end;

/**

* @param start the beginning of the period.

* @param end the end of the period; must not precede start.

* @throws IllegalArgumentException if start is after end.

* @throws NullPointerException if start or end is null.

*/

public Period(Date start, Date end) {

if (start.compareTo(end) > 0)

throw new IllegalArgumentException(start + " after "

+ end);

this.start = start;

this.end = end;

}

public Date start() {

return start;

}

public Date end() {

return end;

}

... // Remainder omitted

}

以上的例子至少有两类错误,类的得本意是start和end都是只读属性,但实际上这得不到保障,如果我写下列代码:

Date start = new Date();

Date end = new Date();

Period p = new Period(start, end);

end.setYear(78); // 修改了p内部变量end

p.end().setYear(78); // 修改了p内部变量end

为了解决这个问题,必须使用有效的防御性拷贝,代码修改如下:

// Repaired constructor - makes defensive copies of parameters

public Period(Date start, Date end) {

this.start = new Date(start.getTime());

this.end = new Date(end.getTime());

if (this.start.compareTo(this.end) > 0)

throw new IllegalArgumentException(start +" after "+ end);

}

// Repaired accessors - make defensive copies of internal fields

public Date start() {

return (Date) start.clone();

}

public Date end() {

return (Date) end.clone();

}

这里简单说一下为什么构造函数使用new,而属性方法使用clone呢?因为构造函数不能保证传入的参数就是java.util.Date而不是它的子类,属性方法就可以保证了。

当然这不是我们的重点,我们看看C++中如果要避免上述问题如何解决:

class Period {

private:

Date start;

Date end;

public:

Period(const Date& start, const Date& end);

const Date& start()const;

const Date& end() const;

... // Remainder omitted

}

实现部分就不用写了,C++几乎不用你做任何附加工作;相比之下Java的返回值需要clone是一个额外的工作,降低了软件的效率,你要知道并不是所有的Class都实现了Cloneable接口,因此它不是一个完美的解决方案。

因此我认为,Java从语言级就应该增加const对象引用方式。

也许我说的不对,毕竟我刚接触Java,希望提出批评和指教。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有