2014-01-22 2 views
0

Бывает, что я делаю плагин для игры в стиле bukkit. У меня класс Арены с перечислением на его статус. Статус по умолчанию - Status.disabled. У меня есть метод, который я вызываю on-Enable, который устанавливает арену в состояние ожидания. Проблема в том, что после вызова метода для каждой арены арена снова отображается как состояние «Отключено». Вот часть моего класса Арена: Переменная не изменяется для другого класса

public class Arena { 
    protected final Main main; 

    public static enum Status{ 
     Idle, 
     InLobby, 
     InCountdown, 
     InGame, 
     Disabled; 
    } 

    private Status status = Status.Disabled; 
    String name; 
    Location lobby; 
    Location start; 
    Location end; 
    List<Location> checkpoints = new ArrayList<Location>(); 
    int lives; 
    int time; 

    public Arena(Main main, String name, Location lobby, Location start, List<Location> checkpoints, Location end, int lives, int time) 
    { 
     this.main = main; 
     this.name = name; 
     this.lobby = lobby; 
     this.start = start; 
     this.checkpoints = checkpoints; 
     this.end = end; 
     this.lives = lives; 
     this.time = time; 
    } 

    public void setStatus(Status statuss){ 
     this.status = statuss; 
    } 

    public final Status getStatus(){ 
     return status; 
    } 

    public final void onEnable(){ 
     this.status = Status.Idle; 
     System.out.println(this.getStatus() + " Trying status set on OnEnable. This is made from an Arena class."); 
     //The message above says status is Idle... 
    } 
} 

Теперь, вот мой onEnable метод, который находится на моем главном классе, который распространяется на JavaPlugin:

ArenaManager manager; 
public void onEnable(){ 
    PluginDescriptionFile pdfFile; 
    pdfFile = this.getDescription(); 
    getLogger().info(pdfFile.getName() + pdfFile.getVersion() + " has been enabled!"); 
    manager = new ArenaManager(this); 
    PluginManager pm = this.getServer().getPluginManager(); 
    pm.registerEvents(new events(this), this); 
    getConfig().options().copyDefaults(true); 
    saveDefaultConfig(); 
    for(Arena arena : manager.getAllArenas()){ 
     arena.onEnable(); 
    } 
    getLogger().info("Plugin contains " + manager.getAllArenas().size() + " arena(s)!"); 
    foo(); 
} 

public void foo(){ 
    for(Arena a : manager.getAllArenas()){ 
     System.out.println("foo " + a.getStatus()); 
    } 
} 

Мой метод называется «Foo» проверяет статус для всех арен. Арены отображаются как отключенные, когда я пытаюсь «foo». Если это полезно, каждая арена сохраняется в файле, поэтому, чтобы получить все арены, я использую мой arenamanager. Метод от arenamanager, используемого в onEnable является:

public List<Arena> getAllArenas(){ 
    List<Arena> arenas = new ArrayList<Arena>(); 
    File[] allfiles = new File(main.getDataFolder() + File.separator + "Courses" + File.separator).listFiles(); 
    assert allfiles != null; 
    for(File f : allfiles){ 
     FileConfiguration con = YamlConfiguration.loadConfiguration(f); 
     String name = con.getString("Name"); 
     Arena a = getCourse(name); 
     arenas.add(a); 
    } 
    return arenas; 
} 

Я попытался распечатывание статуса, а также из PlayerInteractEvent (по знаку), но арена все еще показывает, как инвалиды. Любая идея о том, как это исправить? К сожалению, на консоли нет ошибок. Спасибо за помощь :)

+0

Действительно ли это код, который вы используете? Кажется, у вас бесконечная рекурсия в 'onEnable()'. –

+0

Где код 'getCourse()'? В зависимости от того, что делает 'getCourse()', похоже, что 'getAllAreans()' создает новые объекты 'Arena' для возвращаемого списка. Поэтому каждый раз, когда вы вызываете 'getAllArenas()', вы создаете новые объекты с 'Status', установленными на' Disabled'. – mdewitt

+0

@ PM77-1 Да, это то, что я использую для onEnable. Я новичок в java, так что я делаю что-то неправильно? – user3091392

ответ

2

Короче:

Переменной status не меняется, потому что вы не спасаете ссылку на List из Arena объектов, которые возвращаются из manager.getAllArenas(), который используется для установки Status на. Вы хотите посмотреть на свой код и найти способ сохранить состояние объекта Arena. Есть несколько разных способов сделать это, но я позволю вам решить, что лучше для вас.

Длинное объяснение ниже:

При создании в Java в Object, вы должны держать объект (ссылку на него) где-то, если вы хотите продолжать использовать один и тот же объект и сохранить состояние.

В вашем методе ArenaManager.onEnable() вы звоните manager.getAllArenas() и установите status поле на каждом Arena объекта Status.Idle. Здесь:

public void onEnable(){ 
    ... 
    for(Arena arena : manager.getAllArenas()){ 
     arena.onEnable(); 
    } 
    ... 
    foo(); 
} 

Логика manager.getAllArenas() по существу

1. Create new List<Arena> 
2. Get the name of all the Arena objects from File 
3. For every File object, create a new Arena object 
4. Add new Arena object to List created in step 1. 

Вы не сохраните этот список в любом месте, когда вы звоните manager.getAllArenas() в методе ArenaManager.onEnable(), поэтому, как только вы выйдете для цикла, все Arena объекты вы устанавливаете Status в методе Arena.onEnable().

Когда вы позвоните по телефону foo() позже в Arena.onEnable(). Вы создаете новый список, когда вы вызываете manager.getAllArenas(), так что этот список не был произведен вашим for-loop, который установил status в Status.Idle

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