Tengo un método que toma referencias de clase como argumentos, algo como a continuación:

getConfigModule(Class klass) {
    //logic to check the class types
}

Llamamos a este método desde otras clases como a continuación:

    getConfigModule(ClassA.class);
    getConfigModule(ClassB.class);
    getConfigModule(ClassC.class);

Necesito escribir algo de lógica en el método para comprobar si "klass" es de un tipo de clase en particular o no. Por ejemplo, para marcar "klass" es de tipo ClassA y ClassB.

0
Abhilash 15 feb. 2018 a las 10:32

2 respuestas

La mejor respuesta

Como mencionó @@ RannLifshitz, la forma más sencilla es acercarse a usted if-then-else if o switch. Si sabe que solo hay 3 opciones y puede apostar que no se agregará nada, entonces está bien.

Para proyectos a largo plazo, se podría usar la forma enum.

public enum PossibleClasses {
    CLASS_A(ClassA.class), CLASS_B(ClassB.class);
    Class klass;

    PossibleClasses(Class klass) {
        this.klass = klass;
    }

    static PossibleClasses fromClass(Class desiredClass) {
        for (PossibleClasses current:PossibleClasses.values()) {
            if (current.klass == desiredClass) {
                return current;
            }
        }
        // here you could implement logic regarding class inheritance or something else.
        throw new IllegalArgumentException("Uknown class:"+desiredClass);
    }
}

Luego, compara con valores de enumeración en lugar de Class.

if (PossibleClasses.fromClass(klass) == CLASS_A) {
  //do something
}

Esto ayudará cuando modifique el código. Por ejemplo, si alguien llama al método con una clase completamente nueva, obtendrá una excepción infromativa. También puede usar algunas funciones estándar para enumeraciones como EnumSet para escribir código claro como

// would be a field
private EnumSet<PossibleClasses> commonOption =  EnumSet.of(CLASS_A, CLASS_B);

// somewhere inside code
if (commonOption.contains(PossibleClasses.fromClass(klass))) { 
   // instructions which are common for both classes
}

Nuevamente, jugar con enumeraciones es una buena idea para proyectos a largo plazo. Para un proyecto de inicio o educación / investigación, lo más probable es que no pueda obtener beneficios de esas líneas adicionales de código.

2
ADS 15 feb. 2018 a las 08:08

Use Foo.class.isAssignableFrom(klass) or klass.isAssignableFrom(Foo.class) si por el mismo tipo quiere decir que la clase Foo es una superclase o superinterfaz de klass o al revés.

Si desea una igualdad estricta, utilice el método equals.

0
user5612971user5612971 15 feb. 2018 a las 07:46