2015-08-18 3 views
0

Я хочу, чтобы проверить, является ли объект экземпляром класса, который расширяет определенный родительский класс. Ниже приведена соответствующая часть кода, который я пишу. Я хочу установить переменную aggType на основе aggDef определенного типа ребенка. Я знаю, что не могу сделать следующее, как показано ниже в коде, но есть ли способ, которым я могу следовать, чтобы выполнять такую ​​функцию? К сожалению, правильный объектно-ориентированный дизайн не вариант, где я могу определить абстрактный метод в родительском и есть дети, знают, что они типа, поскольку они являются запатентованными недоступные внутренние библиотекиКак узнать, является ли объект экземпляром класса, который расширяет определенный родительский элемент в java

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"; 
    } 
} 

ответ

0

Сделайте сами Map<Class<? extends AggDef>, String>; заполнить его; и посмотрите его через aggDef.getClass() вместо цепочки if-else/instanceof.

2

Вместо того, чтобы идти через все эти умственную гимнастику, почему бы не просто писать объектно-ориентированный код, что-то вроде:

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 - неплохое указание на то, что вы действительно не правильно смоделировали свое приложение.

+0

или даже лучше, 'interface Typed {type getType(); } 'и' класс AggDef реализует Typed ... ' – Bohemian

+0

Это, к сожалению, не является вариантом, так как AggDef, который в конечном итоге становится доступным, содержит список AggDefs. И если те aggDefs содержат определенный тип, весь тип будет differnet –

+1

@Horse Я думаю, вам нужно показать, что в вашем вопросе тогда - пожалуйста, отредактируйте его, чтобы немного подробнее узнать. – Bohemian

Смежные вопросы