【问题标题】:instanceOf in a Controller class ok? (Cannot edit any other class)控制器类中的 instanceOf 好吗? (不能编辑任何其他类)
【发布时间】:2014-11-10 10:56:18
【问题描述】:

该项目有 4 个班级。一个 Person,一个扩展 Person 的 Employee 和一个扩展 Employee 的 Academic。 我还有一个 Store,它是用户制作的 Array 的替代品。 Store的其中一个函数是‘elementAt()’,它返回给我们一个Store中的对象。

我遇到的问题是 elementAt() 总是以 Person 类型返回。这是一个大问题,因为在我的 Controller 类中,在我让用户执行仅适用于 Academic 的操作之前,我需要检查用户是否实际选择了员工。

public Person elementAt(int index)
{
// Returns element at position index
return list[index];
}

有一个大问题;根据项目规范,我无法进一步更改 Person、Employee、Academic 或 Store 类。意思是,我必须在我的控制器类中以某种方式确定 Store 索引的类型。

我想让有更多经验的人来运行它,所以感谢您的关注。

【问题讨论】:

  • 我认为硬编码并隐式创建权限是错误的方法(权限不是允许主体做某事,而是指对对象做某事)。是否可以由对象完成或对对象执行某些操作应由权限确定。恕我直言,方法拦截器检查要处理的对象的规则将是一种更简洁的方法。

标签: java oop instanceof


【解决方案1】:

在我看来,Instanceof 是您唯一的选择;我不认为在这种情况下使用它是邪恶的。但你是对的,在对象中思考并不是最好的事情;o)

至少你可以像这样封装

public boolean isAcademic(Person p) {
    return p instanceof Academic;
}

将“代码气味”集中在一个位置,并使其更易于以后重构。

【讨论】:

    【解决方案2】:

    我不知道我是否正确,但如果您只想检查返回的对象类型,请执行以下操作:

    Person person = store.elementAt(0);
    if (person instanceof Academic) {
       //do stuff
    }
    

    【讨论】:

    • 我在我的程序中使用过它,但我在 Stack Overflow 和其他地方读到过,不赞成使用 'instanceof'。我只是在寻找任何潜在的替代品,但感谢您提供一些帮助!
    • 那么为什么接受的答案暗示了完全相同的事情?哈哈哈
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-18
    • 2016-09-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多