java—好的实践是在比较器中进行铸造吗?

uqdfh47h  于 2021-07-03  发布在  Java
关注(0)|答案(1)|浏览(309)

我还有下节课

class Person {  private String name; }

class Student extends Person {  private int studyPlace;  private int studyYears; }

class Worker extends Person {  private String workPosition;  private int experienceYears; }

我想把所有这些类存储在一个集合中 List<Person> persons. 为了分类,我想用下一节课

class DurationComparator implements Comparator<Person> {

    @Override
    public int compare(Person o1, Person o2) {
        if (o1 == null && o2 == null) {
            return 0;
        }
        if (o1 == null) {
            return 1;
        }
        if (o2 == null) {
            return -1;
        }

        int p1 = 0;
        int p2 = 0;

        if (o1 instanceOf Student){
            p1 = ((Student) o1).getStudyYears();
        }

        if (o1 instanceOf Worker){
            p1 = ((Worker) o1).getExperienceYears();
        }

        if (o2 instanceOf Student){
            p2 = ((Student) o2).getStudyYears();
        }

        if (o2 instanceOf Worker){
            p2 = ((Worker) o2).getExperienceYears();
        }

        return p2 - p1;

    }
}

我知道lsp普林西比。将子类类型转换为基类型是一种好的做法吗?

vcirk6k6

vcirk6k61#

我觉得不太好。你的“person”比较器必须知道所有可能的子类。当您稍后添加“manager extends person”时,必须修复comparator,否则所有经理都是相同的。如果还有其他人没有什么“年”的价值,你不知道该怎么比较。
一个更好的方法是让person有一个抽象方法,返回用于比较的数字。

class Person {
    …
    int getYears();
    …
 }

那么比较器的主体(忽略空的考虑)就是

return o2.getYears() - o1.getYears();

这是对person的侵犯,因为首先它为您以前没有的person添加了一个方法,其次它强制每个person子类公开一个合适的'years'值。另一方面,如果你不这样做,那么能够比较武断的人的想法是没有根据的。

相关问题