2016-06-16 3 views
-1

Я создал ArrayList под названием ArrayList<Arena>, поскольку я создаю плагин Spigot.Добавление двух классов в ArrayList <Class> заполняет arraylist двумя дубликатами

public static ArrayList<Arena> all = new ArrayList<Arena>(); 

теперь у меня есть класс, и это шаг при создании экземпляра:

public Arena(String name, int min, int max) { 
    Arena.name = name; 
    Arena.layout = "default"; 
    Arena.customName = CManager.getPlugin().getArenaConfig().getString("arenas." + name + ".custom-name"); 

    ArenaManager.addToArenaList(this); 
    ArenaManager.arenaNames.add(Arena.name); 
    Bukkit.getServer().getConsoleSender().sendMessage(ChatColor.LIGHT_PURPLE + "[" + plugin.getPdfFile().getName() 
      + "]" + ChatColor.GREEN + " [#] (Instanciated arena " + Arena.name + ")"); 

    Arena.min = min; 
    Arena.max = max; 
    Arena.world = Bukkit.getWorld(Arena.name); 

    waiting = true; 
    starting = false; 
    game = false; 
    finished = false; 
} 

У меня есть проблема с этим, казалось бы, простой кусок кода.

public static void addToArenaList(Arena a) { 
    all.add(a); 
    checkArena(a); 
} 

public static void checkArena(final Arena a) { 
    Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, new Runnable() { 
     public void run() { 
      if (!(all.contains(a))) { 
       Bukkit.getServer().getConsoleSender().sendMessage(
         ChatColor.LIGHT_PURPLE + "[" + plugin.getPdfFile().getName() + "]" + ChatColor.RED 
           + " [E] (Error while adding arena " + a.getArenaName() + "to list)"); 
      } else { 
       Boolean found = false; 
       for (Arena f : all) { 
        if (f.getArenaName().equals(a.getArenaName())) { 
         if (found == true) { 
          Bukkit.getServer().getConsoleSender() 
            .sendMessage(ChatColor.LIGHT_PURPLE + "[" + plugin.getPdfFile().getName() + "]" 
              + ChatColor.RED + " [E] (Duplicate found with arena " 
              + a.getArenaName()); 
          continue; 
         } 
         found = true; 
        } 
       } 
       if (found == false) { 
        Bukkit.getServer().getConsoleSender() 
          .sendMessage(ChatColor.LIGHT_PURPLE + "[" + plugin.getPdfFile().getName() + "]" 
            + ChatColor.RED + " [E] (Error while adding arena " + a.getArenaName() 
            + "to list)"); 
       } 
      } 
     } 
    }, 10L); 
} 

Но по какой-то причине я получаю дубликаты последней арены, здесь также является первым этапом процесса

public void onEnable() { 
    Methods.sendColoredMessage(this, ChatColor.LIGHT_PURPLE, ("Registering Commands...."), ChatColor.YELLOW); 
    registerCommands(); 
    Methods.sendColoredMessage(this, ChatColor.LIGHT_PURPLE, ("Registering Events...."), ChatColor.YELLOW); 
    registerEvents(); 
    Methods.sendColoredMessage(this, ChatColor.LIGHT_PURPLE, ("Registering Config...."), ChatColor.YELLOW); 
    createFiles(); 
    Methods.sendColoredMessage(this, ChatColor.LIGHT_PURPLE, ("Attempting to load arenas...."), ChatColor.GOLD); 
    ArenaManager.all.clear(); 
    ArenaManager.arenaNames.clear(); 
    ArenaManager.createArenas(); 
    Methods.sendColoredMessage(this, ChatColor.AQUA, 
      (pdfFile.getName() + " has been enabled! (V." + pdfFile.getVersion() + ")"), ChatColor.GREEN); 
} 
public static void createArenas() { 
    if (plugin.getArenaConfig().getConfigurationSection("arenas") != null) { 
     int count = 0; 
     ArrayList<String> listed = new ArrayList<String>(); 
     for (String arena : plugin.getArenaConfig().getStringList("enabled")) { 
      count++; 
      Bukkit.getServer().getConsoleSender() 
        .sendMessage(ChatColor.LIGHT_PURPLE + "[" + plugin.getPdfFile().getName() + "]" 
          + ChatColor.GREEN + " [" + count + "] (Loading arena " + arena + ")"); 
      int min = plugin.getArenaConfig().getInt("arenas." + arena + ".min"); 
      int max = plugin.getArenaConfig().getInt("arenas." + arena + ".max"); 

      new Arena(arena, min, max); 
     } 
     Bukkit.getServer().getConsoleSender().sendMessage(ChatColor.LIGHT_PURPLE + "[" 
       + plugin.getPdfFile().getName() + "]" + ChatColor.GREEN + " [A] Loaded arenas are listed below:"); 
     for (Arena a : all) { 
      if (listed.contains(a.getArenaName())) { 
       continue; 
      } 
      Bukkit.getServer().getConsoleSender().sendMessage(ChatColor.LIGHT_PURPLE + "[" 
        + plugin.getPdfFile().getName() + "]" + ChatColor.GREEN + " [A] - " + a.getArenaName()); 
      listed.add(a.getArenaName()); 
     } 
    } else { 
     Bukkit.getServer().getConsoleSender().sendMessage(ChatColor.LIGHT_PURPLE + "[" 
       + plugin.getPdfFile().getName() + "]" + ChatColor.RED + " [E] No arenas have been found!"); 
    } 
} 

Так что, если у меня было 4 арен и последняя называлась EndArena, в мой массив, я в конечном итоге с 4 элементами все с тем же классом Arena EndArena. Я все пробовал, и обычно мне не нравится просить о помощи (я сам предпочитаю учиться), но это раздражало меня так долго, что я должен ее представить.

Также здесь моя арена YAML файл

YAML Config

ответ

3

Это происходит потому, что вы не использовать объекты правильно.

Насколько я понял ваш код, вы хотите создать какую-то арену, назначив некоторые значения этой Арене, а затем добавьте ее в какой-либо ArenaManager. Это отлично. Для этого вам нужно использовать переменные экземпляра, поэтому каждая созданная Арена будет иметь свое собственное имя. Уникальный для этого конкретного экземпляра.

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

Смотрите некоторый пример:

Imagine есть очень простой и наивный класс Person (в соответствии с вашим подходом).

public class Person { 
    private static String name; 
    public Person(String name) { 
     Person.name = name; 
    } 
} 

Если бы вы сделать что-то вроде: нового человека ("Адам"); новое лицо («Виктор»);

Вы закончили бы экземпляры 2 человека, имеющие (указывающие) одну статическую переменную, которая в конечном итоге имела бы значение Victor. Это, безусловно, не то, что нам нужно здесь. Для того, чтобы иметь эту работу правильно, вы должны использовать переменные экземпляра:

public class Person { 
    private String name; 
    public Person(String name) { 
     this.name = name; 
    } 
} 

Теперь после нашего образца кода вы бы 2 человека, каждый с другим именем. На самом деле не имеет значения, как вы обращаетесь к ним, что действительно важно здесь, так это они должны быть полями экземпляров, то есть каждый экземпляр имеет отдельный блок в памяти для хранения этого значения. Если поле является статическим, это просто означает, что существует одно возможное значение переменной для всех разных объектов - каждый раз, когда вы его изменяете, он будет изменен для всех других объектов.

Так Суммируя все это:

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

В вашем конструкторе у вас есть: Arena.name = name; Arena.layout = "default";

Эти две строки кода всегда перезаписывают статическое поле в вашем классе Arena.

В классе Арена у вас есть что-то вроде (примечание статического ключевого слова):

private static String name; 

Вам нужно иметь:

private String name; 

поэтому каждый экземпляр имеет свое собственное имя. Пожалуйста, прочитайте о случаях и статических полях, это упростит понимание! Вот пример документа из обучающих программ Java: https://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html В этом учебном пособии мы рассмотрим все это действительно красиво!

+0

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

+0

Я могу немного рассказать о своем ответе. Обычно статическое поле одинаково для всех экземпляров объекта. Здесь вам нужно указать поле экземпляра - ведь вы назначаете значения в конструкторе, которые подсказывают, что вам нужно, чтобы они были разными. То, что вы здесь делаете, дает одно и то же имя во всех экземплярах Арены, что явно не нужно. Позвольте мне добавить несколько примеров в мой ответ :) – akakus

+0

О, ладно, спасибо, я буду ждать ответа –

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

  • Нет связанных вопросов^_^