(软件构造)lab3遇到的问题以及相应的解决

只说实验中遇到的问题

一、该实验中轨道物体对象的可复用性并不强

设置了一个抽象类PhysicalObject,轨道物体对象去实现这个抽象类中的方法,然而抽象类的成员变量只有label可以被所有轨道物体复用,其他属性都是轨道物体所独有的:
Planet的颜色、状态、轨道半径等;
Electron的mark;
Person的性别、年龄;

二、使用泛型导致的强制类型转换

circularOrbit包中,所有的具体轨道系统都实现ConcreteCircularOrbit接口。而这个接口定义的时候使用了泛型<L, E>,其中L代表中心物体的类型,E代表轨道物体的类型。所以这三个具体系统在实现接口的时候也必须带上类型参数<L, E>。
比如,在用正则表达式匹配文件时,匹配到了中心物体的信息,构造了中心物体之后要把它加入到轨道系统中,就需要强制类型转换。
(软件构造)lab3遇到的问题以及相应的解决
轨道物体也是。
虽然在构造轨道系统的时候给好的类型参数跟读文件匹配时构造的对象类型一模一样,但这种强制类型转换会让IDE给出warning。于是只好在方法开头标注上:
@SuppressWarnings(“unchecked”)
来消除这个warning。

三、捕获组

实验一也用了正则表达式匹配,但是当时是用\t分割读进来的那一行字符串。
由于这次轨道系统的文件信息比较多,我使用捕获组这一工具来读信息。
也就是在正则表达式中,对你想要捕获的信息加上括号,一旦匹配成功,括号内的信息就被存储到一个字符串数组group中。group(0)是一整行字符串,group(1)开始往后,一个字符串代表一个捕获对象。非常好用:
(软件构造)lab3遇到的问题以及相应的解决
构造正则表达式
(软件构造)lab3遇到的问题以及相应的解决
使用捕获组捕获到的信息
注:如果已经知道你要匹配的内容的某一位置上是什么东西,就直接把它写出来!
比如说:匹配元素名称的时候,匹配的这一行的开头一定是:
“ElementName ::=”,那就不要写成“[a-zA-Z]+ ::=”,否则容易引起重复匹配!(即匹配到了不想要的内容,可能在其他行中出现)

四、避免空引用(空指针)

这里尤其是指map。在调用map.get(key)方法的时候,一定要先用map.containsKey(key)判断keySet中是否有你要get的元素,否则就会抛异常:NullPointerException。
如果一定要get这个key,而keySet中还不存在这个key,那说明算法有错误!
(软件构造)lab3遇到的问题以及相应的解决
如上图示例所示。

五、强制类型转换

两个int类型的变量做乘除法转换成double,一定要先给分子或分母转换成double!不要算出结果之后把整个结果转换成double,这样还是会有截断误差!
比如:
int y = 5, int z = 2;
double x = (double) y / z; 答案为2
double x = ((double) y) / z;答案为2.5
double x = y / (double) z;答案为2.5

六、GUI

可视化的时候用JFrame类,使用Graphics来画画。画圆的时候,圆位置表示的坐标是圆左上角的坐标(这个点不在圆上,而是两条之间的交点,这两条直线是:平行于x轴的圆的切线和平行于y轴的圆的切线在第二象限的交点!)