首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何查看对象是否是在java中扩展特定父类的类的实例

如何查看对象是否是在java中扩展特定父类的类的实例
EN

Stack Overflow用户
提问于 2015-08-18 23:05:06
回答 2查看 59关注 0票数 0

我希望能够检查对象是否是扩展特定父类的类的实例。下面是我编写的代码的相关部分。我希望根据特定子类型的aggType设置aggDef变量。我知道我不能像下面代码中所示的那样做下面的事情,但是有什么技术我可以遵循来完成这种功能吗?,不幸的是,正确的面向对象设计不是一个选项,我可以在父程序中定义一个抽象方法,并且让孩子知道他们是哪种类型,因为这些都是专有的、不可访问的内部库

代码语言:javascript
复制
    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";
                }
            }
     }

另一种选择是我在下面的方法,它确实编译和工作。但这既乏味又丑陋。这又如何改善呢?

代码语言:javascript
复制
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";
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-08-18 23:29:06

让自己成为一个Map<Class<? extends AggDef>, String>;填充它;并通过aggDef.getClass()来查找它,而不是if- the /instanceof链。

票数 0
EN

Stack Overflow用户

发布于 2015-08-18 23:09:26

为什么不直接写一些面向对象的代码,比如:

代码语言:javascript
复制
public abstract class AggDef { // horribly named class
    public abstract Type getType();
...
}

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

代码语言:javascript
复制
public class StatAggDef extends AggDef { 

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

}

当您添加新类型时,这是更可扩展的。使用instanceof是一个很好的指示,表明您没有真正正确地建模您的应用程序。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32084003

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档