2017-02-11 13 views
1

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

Улов есть, есть различные варианты Arenas. Таким образом, могут быть арены для джунглей, пустынные и т. Д. Все эти различные варианты (подклассы абстрактного класса Arena) должны храниться в разных таблицах, поскольку переменные (и, следовательно, столбцы) различаются для каждого типа арен.

Мой вопрос: из описанного ниже класса менеджера, содержащего массив общего типа, как я могу получить требуемые столбцы из класса child (T) и его родителя. Я использую общий тип, потому что я также хочу использовать этот класс для управления информацией игрока (которая также должна быть сохранена в базе данных) позже.

Вот класс-менеджер:

public class Manager<T extends Savable> { 
    private Connection connection; 
    private List<Column<?>> columns; 

    private List<T> instances; 

    public Manager() { 
    fillColumnArray() 

    try { 
     connection = getSQLConnection(); 
     Statement s = connection.createStatement(); 
     s.executeUpdate(getCreateQuery()) 
     s.close(); 

    } catch (SQLException e) { 
     e.printStackTrace(); 
    } 
    } 

    public void fillColumnArray() { 
    // Somehow, manages to get the needed columns from 
    // the parent class and the child class 
    } 

    public Connection getSQLConnection() { 
    // Creates a mysql connection to a database 
    // from parameters on a local file and returns it 
    } 

    public String getCreateQuery() { 
    // Creates the query from the previously found columns 
    } 

    /* */ 
} 

Вот класс Column используется в менеджере:

public class Column<U> { 
    private String name; 
    private U defaultValue; 

    /* */ 
} 

И здесь возможны переменные класса Arena и один из возможных детей

public abstract class Arena implements Savable { 
    private Vector centerPosition; 
    private int radius; 
    private int gameLenght; 

    /* */ 
} 

public class JungleArena extends Arena { 
    private int treeHeight; 
    private boolean daytime; 

    /* */ 
} 

Я думал о многих разных возможностях. Один из них заключался в том, чтобы добавить метод queryColumns() в интерфейс Savable, но этот параметр не работает, поскольку при создании Менеджера я могу получить доступ к классу T статическим способом.

Итак, я подумал о добавлении статического метода requestColumns() внутри дочернего элемента и родителя, но поскольку я использую общий тип, компилятор не понимает, откуда приходит этот метод.

Тогда я подумал о том, чтобы отличить тип T к его специфическому типу Arena, но тогда он не будет работать дальше в моем проекте при использовании того же класса для хранения игроков.

Надеюсь, что это достаточно ясно.

Есть ли у кого-нибудь идеи сделать что-то работу или просто другим способом сделать что-то из вашего понимания?

Благодаря

+0

Просто, чтобы быть уверенным, что вы задаетесь вопросом, как сказать менеджеру, что таблица, чтобы сохранить значения в соответствии с классом «Арены»? – MikaelF

+0

Ну, я хочу сказать менеджеру, какие значения будут в таблице –

+0

Можете ли вы использовать оператор instanceof для проверки того, что такое класс? – MikaelF

ответ

0

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

Лично, без какой-либо достойной структуры, способной на это уже, я бы определил аннотацию, чтобы помещать публичные получатели полей столбца. Как так:

@Retention(RetentionPolicy.RUNTIME) 
@Target(ElementType.METHOD) 
public @interface Column { 
    String name() default ""; 
} 

Вы могли бы использовать отражение, чтобы получить эти добытчик, а затем ссылаться на методах экземпляра, таким образом, получая значения, а также.Например, если этот класс:

class Entity { 
    ... 

    @Column(name = "Name") 
    public getName() { return name; } 

    @Column(name = "Height") 
    public getHeight() { return height; } 
} 

я мог получить имена столбцов и значения следующим образом:

Entity e = new Entity("First", 42); 
    Method[] methods = e.getClass().getMethods(); 
    Map<String, Method> colums = new HashMap<>(); 
    for (Method m : methods) { 
     Column c = m.getAnnotation(Column.class); 
     if (c != null) { 
      colums.put(c.name(), m); 
     } 
    } 
    colums.entrySet().forEach(entry -> { 
     try { 
      System.out.println(entry.getKey() + ": " + entry.getValue().invoke(e)); 
     } catch (IllegalAccessException | InvocationTargetException e1) { 
      e1.printStackTrace(); 
     } 
    }); 


Output > 
Height: 42 
Name: First