2016-02-01 5 views
2

У меня есть два различных перечислений:Pass перечисление класса в качестве параметра метода в Java

public enum A { 
    mass(10); // many other values omitted for clarity 

    private final int m; 

    private A(int m) { this.m = m; } 

    public int value() { return this.m; } 

} 

public enum B { 
    mass(100); // many other values omitted for clarity 

    private final int m; 

    private B(int m) { this.m = m; } 

    public int value() { return this.m; } 
} 

и хочу передать класс перечисления в качестве параметра к моей функции. Из других ответов, которые я нашел на SO, предполагается, что я могу передать класс, но я не знаю, как правильно определять и использовать A или B перечисление в теле функции:

public int mass(Class<?> clazz) { 
    // Is it the best way? How to avoid a bunch of ifs? 
    if (clazz == A.class) return A.mass.value(); 
    if (clazz == B.class) return B.mass.value(); 
} 
+1

Это кажется действительно уродливым, и, как будто вам не нужно это делать, но он должен работать нормально. – bmargulies

+5

Почему бы просто не использовать 'A' и' B' интерфейс с методом getMass()? – resueman

ответ

3

Не уверен, что вы» я пытаюсь выполнить приятеля, но вам, похоже, нужен полиморфизм. Попробуйте использовать интерфейс с Перечисления, как это:

public enum A implements MassProvider { 
    MASS(10); 
    private int mass; 

    A(int mass) { 
     this.mass = mass; 
    } 

    @Override 
    public int getMass() { 
     return mass; 
    } 
} 

public enum B implements MassProvider { 
    MASS(100); 
    private int mass; 

    B(int mass) { 
     this.mass = mass; 
    } 

    @Override 
    public int getMass() { 
     return mass; 
    } 
} 

public interface MassProvider { 
    int getMass(); 
} 

public static int mass(MassProvider p) { 
    return p.getMass(); 
} 

В принципе, вместо того, чтобы передать класс методу масс вы передаете MassProvider, реализуемый как перечислений.

+0

Кажется, что полиморфизм - это путь, но я до сих пор неясно, как передать экземпляр A или B функции массы (MassProvider p)? –

+0

Просто передайте экземпляр A или B массовому методу. Поскольку A и B реализуют MassProvider, он будет работать. – Ulises

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