java - 如何查看一个对象是否是扩展java中特定父级的类的实例

标签 java oop

我希望能够检查一个对象是否是扩展特定父类的类的实例。以下是我正在编写的代码的相关部分。我想根据 aggDef 属于特定子类型来设置 aggType 变量。我知道我无法执行以下代码中所示的操作,但是我可以遵循一种技术来执行此类功能吗? 不幸的是,正确的面向对象设计不是一种选择,我可以在父级中定义抽象方法并让子级知道它们是什么类型,因为这些是专有的不可访问的内部库

    String aggType=null;
    AggDef aggDef = queryAggs.get(aggsKey);
        if(aggDef != null){
           if(aggDef instanceof TermAggDef){
                    aggType = "terms";
                } 
                else if (aggDef instanceof ? extends StatAggDef){
                    aggType = "terms_stats";
                }
                else if (aggDef instanceof RangeAggDef){
                    aggType = "range";
                } else{
                    aggType= "statistical";
                }
            }
     }

另一种方法是我下面的方式,它可以编译和工作。但这很乏味而且很难看。如何改进?

String aggType;
AggDef aggDef = queryAggs.get(aggsKey);
if(aggDef != null){

    if(aggDef instanceof TermAggDef){
        aggType = "terms";
    } 
    else if (aggDef instanceof StatAggDef){
        if(aggDef instanceof AvgAggDef){
            aggType= "statistical";
        }else if(aggDef instanceof MaxAggDef){
            aggType= "statistical";
        }else if(aggDef instanceof MinAggDef){
            aggType= "statistical";
        }else if(aggDef instanceof SumAggDef){
            aggType= "statistical";
        } else{
            aggType = "terms_stats";
        }
    }
    else if (aggDef instanceof RangeAggDef){
        aggType = "range";
    }
}

最佳答案

与其经历所有这些心理体操,为什么不直接编写面向对象的代码,例如:

public abstract class AggDef { // horribly named class
    public abstract Type getType();
...
}

并在每个子类上重写该方法。

public class StatAggDef extends AggDef { 

    @Override
    public Type getType() {
        //something concrete, ideally not a String....
    }

}

当您添加新类型时,它的可扩展性要强得多。使用 instanceof 很好地表明您尚未真正正确地对应用程序进行建模。

关于java - 如何查看一个对象是否是扩展java中特定父级的类的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32084003/

相关文章:

java - 对 Android 库使用提供的/compileOnly 依赖项

oop - TclOO : Access nested objects

java - BlockingQueue的put()和高并发

java - 如果对于每个条目只有一个线程访问它,映射是否需要同步?

java - 使用 pfx 文件在 jetty 服务器中配置 SSL

java - 我可以使用 springboot-javafx-support 从初级阶段获取根 Pane 吗?

c++ - 使用引用时多态性并不总是有效

javascript - 在javascript中通过继承调用两个函数

php - 拆分一个大的 PHP 类

javascript - OOJS - 将每个元素绑定(bind)到特定点击