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