2014-09-19 3 views
0

У меня есть класс, который имеет разные переменные, и пользовательский Enum также является одним из них. Этот класс в основном представляет данные в таблице.Проблемы с дизайном Java с перечислениями

например)

Class A { 

    private String x; 
    private String y; 
    private UserEnum z; 
    .... 
    .. 

    private UserEnum getField() { 
    .... 
    } 

    private void addRow() { 
    // uses the UserEnum here 
     ....   
    } 

}

У меня есть другой класс (класс B), который делает такую ​​же функциональность как класса А (имеет те же методы и поля), за исключением, что у меня другое определяемое пользователем перечисление (например, UserEnum2). Оба эти числа имеют разные значения констант.

Что было бы хорошим дизайном, чтобы избежать дублирования кода, который существует в обоих этих классах. Я новичок в Enums, и я не уверен, как мы можем на самом деле обобщить вышеупомянутые два класса (CLASS A и CLASS B), которые имеют разные Enums.

ответ

0

Делегирование. Передайте дублированные методы в один класс делегатов, и все 3 класса (2 перечисления и делегаты) реализуют интерфейс для этих дублированных методов.

2

Создать базовый класс с Общин полями и Митос, а затем создать подклассы с остальными полями и методами/

Class abstract Base { 

    private String x; 
    private String y; 
    .... 
    .. 

    private UserEnum getField() { 
    .... 
    } 

    private abstract void addRow(); 
} 

class A extends Base{ 
    private UserEnum z; 
    ... 
} 

class B extends Base{ 
    private UserEnum2 z; 
    ... 
} 
1

Я решил эту проблему с помощью инструмента некоторое время назад. Образом я имел дело с этим должен был иметь базовый класс, который был общим:

public class Table<Column extends Enum<Column> & Table.Columns> { 

    public interface Columns { 
    } 

подклассы выглядеть примерно так:

public class VersionTable extends Table<VersionTable.Column> { 

    public enum Column implements Table.Columns { 

    Version, 
    Alias; 

    } 

они регистрируют свои специфические enum через super(Columns) конструктор.

Очевидно, что существует гораздо больше, чем я могу опубликовать в ответе, но будьте уверены, что с этой структурой можно использовать полностью безопасный тип.

+1

Я вроде как эта идея. В основном вы пытаетесь создать общую таблицу с разными типами перечислений (столбцы). Я искал аналогичное решение, но не знал, как это можно сделать с помощью типов Enum. Благодаря!! – dsreddy

+0

@dsreddy - элегантность этой техники заключается в том, что вы получаете тип безопасности ** и ** перечисления. – OldCurmudgeon

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