【问题标题】:How to avoid using instanceof in this homework?如何避免在这个作业中使用 instanceof?
【发布时间】:2019-10-12 00:13:11
【问题描述】:

所以我的教授给了我一个这样的 UML。前几天我和一个朋友聊天,他说使用 instanceOf 是一种不好的做法。

在这个例子中,如何避免使用它?

在方法 modify 中,我必须使用 instanceOf 来检查我是否有教授或学生的实例,然后我进行切换以修改对象的每个属性。

他还告诉我在类部门实现接口没有意义..应该在类Person..中实现它..

任何有关如何改进此练习的帮助或指导都会很棒!

public interface Iactions{
  void add(Object o);
  void delete(Object o);
  void modify(Object o);
  void show(Object o);
}


    public class Department implement Iactions{
    // Attributes
    ArrayList<Person> myGroupPersons;

    // Implementing the methods from interface Iactions

    @Override
    public void modify(Object o) {
        if (o instanceof Professor) {
            modifyProfessor((Professor) o);
        } else if (o instanceof Student) {
            modifyStudent((Student) o);
        }
      }
   }

public class Person {
  // code
}

public class Profesor extends Person{
  // code
}

public class Student extends Person{
  // code
}

抱歉信息不足: 添加和删​​除,一种插入对象并从arrayList中删除对象的方法。 对于 show ,我认为只是 arrayList 的打印。 并且修改,我需要有一个菜单,我可以在其中选择我想要修改的对象的哪些属性。

这是我的猜测,因为他只给了我们 UML(我没有写这个 uml)而且他没有说其他任何东西。

【问题讨论】:

  • 注意是implements,而不是implement
  • 能否解释一下增删改查的方​​法规范?添加和删​​除可能是可以猜到的;我假设它们的意思是“将给定的对象添加到这个容器/从这个容器中删除”。不过,我不确定 show 和 modify 应该做什么。
  • 您是获得您在上面发布的Iactions 界面还是您自己编写的?它将帮助我们帮助您。根据你所说的教授要求你做的事情,听起来Person应该实现那个接口,每个人都应该做add(department)delete(department)modify(person)show(null),但实际上,有一个很多我们不知道,即使我的猜测是正确的,它也不是一个易于使用的模型恕我直言。 :)
  • 使用instanceof 并不比使用Java 的其他特性更糟糕。关键是在有意义的时候使用这些功能。使用 instanceof 最常用于覆盖接受 Object 类型参数的 equals。

标签: java interface instanceof


【解决方案1】:

我建议你可以在 java 中使用泛型。比如:

public class People {
    String name;

    public People() {
    }
}


public interface IAction<T> {
    void add(T o);
    void delete(T o);
    void modify(T o);
}


public class Departement  implements IAction<People> {

    @Override
    public void add(People o) {
        // TODO Auto-generated method stub

    }

    @Override
    public void delete(People o) {
        // TODO Auto-generated method stub

    }

    @Override
    public void modify(People o) {
        // TODO Auto-generated method stub

    }

}

【讨论】:

    【解决方案2】:

    Instanceof 使用起来还不错,但总体来说是糟糕的设计。

    Person 类可以是抽象的并且有一个方法 modify。 在学生和教授中,您有自己的方法实现。 这样你就不需要使用了

    if (Object instanceof Student){
    //code
    }
    

    而是:

    Object.modify();
    

    关于界面部分,它的工作方式相同。

    public class Person implements Iactions {
    
    public void modify(){
    //code
    }
    }
    
    //then call this
    student.modify();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-18
      • 2022-11-15
      • 2011-09-03
      • 2013-03-05
      • 1970-01-01
      • 2020-08-30
      • 2020-07-21
      相关资源
      最近更新 更多