1. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

[РЕШЕНО] Передача методов/переменных с одного класса в другой

Тема в разделе "Разработка плагинов для новичков", создана пользователем Jamess, 20 июл 2023.

Статус темы:
Закрыта.
  1. Автор темы
    Jamess

    Jamess Новичок Пользователь

    Баллы:
    16
    Имя в Minecraft:
    James
    Всем привет, мне нужно понять как вызвать какой либо метод с одного класса в другом или передать переменную.

    Грубо говоря есть класс KitManager
    в нём метод warrior()

    И есть ещё один класс ArenaManager
    в нём метод onJoin()

    Как мне с класса KitManager поместить метод warrior в метод onJoin
    Не используя при этом статику, говорят это плохо юзать её в большом количестве а учитывая если я не умею передавать методы с других классов я этим злоупотребляю, хочу избавится от статики.
     
  2. Автор темы
    Jamess

    Jamess Новичок Пользователь

    Баллы:
    16
    Имя в Minecraft:
    James
    Знаю что можно таким образом:

    Код:
    private KitManager kitManager;
    
    public void onJoin(){
    kitManager = new KitManager();
    
    kitManager.warrior();
    
    }
    Но нужно немного другое, для того примера что я привёл, соглашусь этого будет достаточно.
    А что делать если:

    Хочу установить точку спавна арены, Location spawn;
    Она находится в классе ArenaManager
    Командой устанавливаю точку спавна через метод в классе ArenaManager

    Код:
    
        private ArenaManager arenaManager;
        
        @Override
        public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
            arenaManager = new ArenaManager();
            
            if(!(sender instanceof Player)) return true;
            
            Player p = (Player) sender;
            Location location = p.getLocation();
            arenaManager.setSpawn(location);
            
            return true;
        }
    И в этом же классе с командой добавлю команду на вход на арену.
    Каждый раз класс ArenaManager будет вызываться вновь новой и точка спавна сбросится
     
  3. FeniksDEV

    FeniksDEV Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    Feniksovich
    Передать объект KitManager в конструктор ArenaManager, т.е. реализовать Dependency Injection.

    Код:
    arenaManager = new ArenaManager(kitManager);
    
    // ArenaManager.java
    private final KitManager kitManager;
    public ArenaManager(KitManager kitManager) {
       this.kitManager = kitManager;
    }
    
    В последнем случае с командой аналогично, не нужно создавать несколько инстансов ArenaManager, его нужно создать единожды и пробрасывать туда, где он используется.
     
  4. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Назначь переменную заранее arenaManager, а не внутри метода onCommand.
    Код:
        private ArenaManager arenaManager = new ArenaManager();
     
        @Override
        public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
     
         
            if(!(sender instanceof Player)) return true;
         
            Player p = (Player) sender;
            Location location = p.getLocation();
            arenaManager.setSpawn(location);
         
            return true;
        }
     
  5. Автор темы
    Jamess

    Jamess Новичок Пользователь

    Баллы:
    16
    Имя в Minecraft:
    James
    Пробовал, выдаёт ошибку, если метод @FeniksDEV не поможет пришлю ошибку.
     
  6. Автор темы
    Jamess

    Jamess Новичок Пользователь

    Баллы:
    16
    Имя в Minecraft:
    James

    Не особо понимаю как это работает и вообще что то делаю неправильно.
    КОД В КЛАССЕ ArenaManager:
    Код:
        private final CommandFFA commandFFA;
        
        public ArenaManager(CommandFFA commandFFA) {
            this.commandFFA = commandFFA;
        }
    КОД В КЛАССЕ С КОМАНДАМИ:
    Код:
    private ArenaManager arena = new ArenaManager(this);
    Я передаю этому конструктору класс в котором буду его использовать, но тогда с другими классами которые так же взаимодействуют с ArenaManager появляется ошибка например в EventHandler
     
  7. Автор темы
    Jamess

    Jamess Новичок Пользователь

    Баллы:
    16
    Имя в Minecraft:
    James
    К сожалению не освоил GiHub, было бы намного проще.
    Если есть у кого прога типа jd-gui
    Чекните код плагина:
    ЯД: https://disk.yandex.ru/d/80h-vK4evLExDA
     
  8. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Так ты назначь переменные в стартовом классе плагина и передай в конструктор другим классам.
    Пример тут. https://github.com/alexandrage/Blank/blob/master/src/Blank
     
  9. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Если тебе сложно освоить гитхаб, установи приложение для пк https://desktop.github.com
    Все в автоматическом режиме будет из гуи оболочки.
     
  10. FeniksDEV

    FeniksDEV Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    Feniksovich
    Сделал правильно, но с точностью до наоборот.
    Мы не передаем ArenaManager все зависящие от него классы (в твоем случае это команда), а передаем зависящим от ArenaManager классам его объект. Таким образом, в конструкторе класса с командой нужно передавать ArenaManager, а не наоборот.
     
  11. Автор темы
    Jamess

    Jamess Новичок Пользователь

    Баллы:
    16
    Имя в Minecraft:
    James
    Дело в том что я юзаю Eclipse а не intellij idea
    Просто потому что комп не тянет :(
    А кодить хочется, не для публикации а чисто для себя, работает как антистресс или коротание времени. Гуглил но там всё через intellij idea а не через Eclipse.
     
  12. Автор темы
    Jamess

    Jamess Новичок Пользователь

    Баллы:
    16
    Имя в Minecraft:
    James

    То-есть так?
    класс с командой.
    Код:
    private ArenaManager arenaManager;
    
    public CommandFFA(ArenaManager arenaManager){
       this.arenaManager = ArenaManager;
    }
     
    Последнее редактирование: 22 июл 2023
  13. NoLogic

    NoLogic Активный участник Пользователь

    Баллы:
    66
    Гугли про геттеры (советую взглянуть в сторону lombok). Инстанции различных менеджеров у тебя обычно хранятся где-то внутри/недалеко от основного класса твоего плагина и ты всегда делаешь геттеры для доступа к ним. Если ты везде будешь создавать объекты нужного тебе класса вместо получения уже существующей инстанции через геттер, то тебя назовут нубом и пошлют читать книжку по джаве для самых маленьких. Ещё советую почитать про статические геттеры, но с ними советуют не перебарщивать, т. к. ломается никому не нужное ООП.

    Истина. Тебе бы в чужом коде покопаться.
     
  14. FeniksDEV

    FeniksDEV Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    Feniksovich
    Да
     
  15. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Да какая разница для себя или нет, гитхаб сохраняет код от утраты и сохраняет историю версий.
    Не имеет значение через какую иде ты кодишь еклипс или идеа. Можешь скачать приложение гитхаб и юзать его. Если тебе сложно настроить еклипс напрямую для работы с гитхабом.
     
  16. Автор темы
    Jamess

    Jamess Новичок Пользователь

    Баллы:
    16
    Имя в Minecraft:
    James
    Геттеры и Сеттеры ты серьёзно? я знаю что это и с чем его едят, мне нужно совсем другое!!!
     
    Последнее редактирование: 27 июл 2023
  17. Автор темы
    Jamess

    Jamess Новичок Пользователь

    Баллы:
    16
    Имя в Minecraft:
    James
    Я это и имел ввиду, гугля в ютубе как напрямую работать с гитом через екслипс, там ролики за 5+ лет.
    А так у меня есть прога эта с гита, не разобрался ещё как загружать код туда, дело времени
     
  18. Автор темы
    Jamess

    Jamess Новичок Пользователь

    Баллы:
    16
    Имя в Minecraft:
    James
    Всем спасибо за ваши ответы <3

    ТЕМА ЗАКРЫТА!
     
Статус темы:
Закрыта.

Поделиться этой страницей