【问题标题】:handle different instance variables in method在方法中处理不同的实例变量
【发布时间】:2015-08-26 21:48:46
【问题描述】:

因此,如果我有一个方法,其中变量可以是一堆不同类的实例,其中只有一些类具有特定的实例变量,我如何在方法中使用此实例变量而不会出现 cannot be resolved or is not a field 错误?

考虑这段代码:

void method1(){
    SuperType randomInstance = getRandomInstance();
    if(randomInstance.stop == true) //do something
}

其中SuperTyperandomInstance 可以容纳的所有可能实例的超类。

但是,实例不一定具有变量 stop,所以我收到错误消息 stop cannot be resolved or is not a field

所以我的问题是,有没有办法解决这个问题,或者我是否必须为不同的实例创建不同的方法,具体取决于它们是否具有变量 stop

【问题讨论】:

    标签: java methods instance-variables


    【解决方案1】:

    如果拥有stop 属性可以被视为SuperType 的某些子类共享的行为,则可以考虑定义一个接口——我们称之为Stoppable——拥有方法getStop(或如果是布尔值,可能是 isStopped)和 setStop

    那么你的代码可能看起来像:

    void method1(){
        SuperType randomInstance = getRandomInstance();
        if (randomInstance instanceof Stoppable) {
            Stoppable sInstance = (Stoppable) randomInstance;
            if(sInstance.getStop() == ...) //do something
        }
    }
    

    【讨论】:

    • 啊,这正是我要找的,我知道我在某个地方读到过这个!
    【解决方案2】:

    给有问题的类一个通用的超类型或接口(从您的代码来看,它们似乎有一个 - SuperType),并在超类型上定义实例字段(它不是“变量”)或定义一个 getter界面上的功能。 (实际上,即使超类型是一个类,最好还是使用 getter 来定义该字段,即使您可以将其设为 publicprotected 实例字段。)

    【讨论】:

    • 嗯,是的,它们有一个超类型,但由于我使用的是框架,所以我无法更改它。但我只会创建一个相互接口,它会正常工作。
    • @PandaDeTapas:是的,你去。我相信在其中添加您自己的接口是Eran's answer
    【解决方案3】:

    如果您无法通过引入接口(例如Stoppable)来更改您的类层次结构,则可以诉诸反射来检测该类是否具有名为 stop 的 provate 字段。

    您可以从 here 类中找到字段“列表”的示例,并且字段记录在 here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-05
      • 1970-01-01
      相关资源
      最近更新 更多