Помогите Нужен совет. Создание объекта для предмета

NoooobKa

Активный участник
Пользователь
Баллы
76
Имя в Minecraft
NoooobKa
Есть предмет, который имеет в себе некоторую расходную прокачку/характеристику (пример: 5/10 Сила).
У него есть GUI, где можно выключать/выключать использование прокачек, добавлять прокачки.
Дело в том что каждый раз когда игрок делает интеракт ивент, создается обьект этого предмета, в обьекте около 12 полей + инвентарь + листенер.
Это ок? Как я понимаю после закрытия GUI, ссылок на обьект больше не останется и он удалится?
Или нужно чудить со статическими методами редактирования?
 
Не совсем понял, что конкретно тебя напрягает. Что в памяти остаются ссылки на твои объекты, что может привести у к утечке?

когда игрок делает интеракт ивент
Также я не понял, каким образом PlayerInteractEvent связан с инвентарём.

в обьекте около 12 полей + инвентарь + листенер
И не понял, как предмет может содержать в себе ссылку на инвентарь и листенер.

Как я понимаю после закрытия GUI, ссылок на обьект больше не останется и он удалится?

Верно. При закрытии инвентаря этот инвентарь удаляется из памяти, а значит и все ItemStack'и будут помечены мусором и удалены сборщиком. Но учти, что чтобы это сработало - тебе самому нигде не нужно хранить ссылки на свои предметы
 
Также я не понял, каким образом PlayerInteractEvent связан с инвентарём.
Каждый интеракт создает обьект, в котором выполняются определённые методы, в том числе и открытие инвентаря
И не понял, как предмет может содержать в себе ссылку на инвентарь и листенер.
Что-то типо этого
Код:
    public Item(ItemStack item) {
        this.inv = Bukkit.createInventory(null, 9, null);
        Bukkit.getPluginManager().registerEvents(this, plugin);
    }
Меня смущает Bukkit.getPluginManager().registerEvents(this, plugin); , я не понимаю тут в качестве Listener идёт this, а this это экземпляр класса или мой новенький созданный обьект который будет до конца храниться где-то?
 
Каждый интеракт создает обьект, в котором выполняются определённые методы, в том числе и открытие инвентаря

Что-то типо этого
Код:
    public Item(ItemStack item) {
        this.inv = Bukkit.createInventory(null, 9, null);
        Bukkit.getPluginManager().registerEvents(this, plugin);
    }
Меня смущает Bukkit.getPluginManager().registerEvents(this, plugin); , я не понимаю тут в качестве Listener идёт this, а this это экземпляр класса или мой новенький созданный обьект который будет до конца храниться где-то?
Если у тебя класс Item реализует интерфейс Listener, и ты этот Listener регистрируешь, то он останется в памяти до выгрузки плагина.
Также вижу, что в классе Item хранишь ссылку на инвентарь. Это значит, что все предметы, находящиеся в инвентаре, также будут храниться в оперативки до выгрузки плагина.

Чтобы избежать такого поведения - придётся отгружать Listener, когда Item уже не нужен. Например, при закрытии инвентаря (InventoryCloseEvent). Снять регистрацию слушателя можно при помощи класса HandlerList. Там есть пара статических методов.

Но я бы тебе рекомендовал пересмотреть архитектуру приложения. Я сильно сомневаюсь, что Listener'ы предназначены для динамической регистрации и анрегистрации в больших количествах.
Поэтому адекватным решением было бы создание одного единственного Listener'а, которые регистрируется при включении плагина.
А инвентари можно создавать только при необходимости (по запросу игрока)
 
Назад
Верх