引入
在第一次软件构造实验中,遇到了这样一个需求:设计一个Person类,其中只有一个字段:String name,并且Person对象的名字不能出现重复。最初步的想法肯定是在Person里面加入一个Static Set字段,记录下所有被用来实例化的String对象。并设计构造函数如下:
分析
根据划线部分可得,这是因为name是final,必须要被初始化。果然,在增加的else语句中将this.name初始化为""后,报错消失。
但比较好的设计是,nameList不含有name则初始化,含有则不返回。但是暂时没找到不返回的方法。于是想出了几种思路。
- 若含有则先将this.name初始化为空,然后程序打印报错信息退出。这一思路过于粗暴,仅因为两个Person对象name相同便退出。
- 打印错误提示信息,但程序不退出,将这一空对象返回,用户自己决定是否要杀死程序。
- 我个人认为比较好的方法,为这一构造函数设计异常,当nameList含有name时抛出异常,返回name为""的Person。这样做的好处是调用Person类的人会在代码运行前便注意到这一个异常,从而自己选择是否要处理这个异常。