Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

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

Статус
Закрыто для дальнейших ответов.

Jamess

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

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

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

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

Код:
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 будет вызываться вновь новой и точка спавна сбросится
 
Как мне с класса KitManager поместить метод warrior в метод onJoin
Передать объект KitManager в конструктор ArenaManager, т.е. реализовать Dependency Injection.

Код:
arenaManager = new ArenaManager(kitManager);

// ArenaManager.java
private final KitManager kitManager;
public ArenaManager(KitManager kitManager) {
   this.kitManager = kitManager;
}

В последнем случае с командой аналогично, не нужно создавать несколько инстансов ArenaManager, его нужно создать единожды и пробрасывать туда, где он используется.
 
Каждый раз класс ArenaManager будет вызываться вновь новой и точка спавна сбросится
Назначь переменную заранее 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;
    }
 
Назначь переменную заранее 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;
    }

Пробовал, выдаёт ошибку, если метод @FeniksDEV не поможет пришлю ошибку.
 
Передать объект KitManager в конструктор ArenaManager, т.е. реализовать Dependency Injection.

Код:
arenaManager = new ArenaManager(kitManager);

// ArenaManager.java
private final KitManager kitManager;
public ArenaManager(KitManager kitManager) {
   this.kitManager = kitManager;
}

В последнем случае с командой аналогично, не нужно создавать несколько инстансов ArenaManager, его нужно создать единожды и пробрасывать туда, где он используется.


Не особо понимаю как это работает и вообще что то делаю неправильно.
КОД В КЛАССЕ ArenaManager:
Код:
    private final CommandFFA commandFFA;
    
    public ArenaManager(CommandFFA commandFFA) {
        this.commandFFA = commandFFA;
    }

КОД В КЛАССЕ С КОМАНДАМИ:
Код:
private ArenaManager arena = new ArenaManager(this);

Я передаю этому конструктору класс в котором буду его использовать, но тогда с другими классами которые так же взаимодействуют с ArenaManager появляется ошибка например в EventHandler
 
К сожалению не освоил GiHub, было бы намного проще.
Если есть у кого прога типа jd-gui
Чекните код плагина:
ЯД: https://disk.yandex.ru/d/80h-vK4evLExDA
Так ты назначь переменные в стартовом классе плагина и передай в конструктор другим классам.
Пример тут. https://github.com/alexandrage/Blank/blob/master/src/Blank
 
Не особо понимаю как это работает и вообще что то делаю неправильно.
КОД В КЛАССЕ ArenaManager:
Код:
    private final CommandFFA commandFFA;
   
    public ArenaManager(CommandFFA commandFFA) {
        this.commandFFA = commandFFA;
    }

КОД В КЛАССЕ С КОМАНДАМИ:
Код:
private ArenaManager arena = new ArenaManager(this);

Я передаю этому конструктору класс в котором буду его использовать, но тогда с другими классами которые так же взаимодействуют с ArenaManager появляется ошибка например в EventHandler
Сделал правильно, но с точностью до наоборот.
Мы не передаем ArenaManager все зависящие от него классы (в твоем случае это команда), а передаем зависящим от ArenaManager классам его объект. Таким образом, в конструкторе класса с командой нужно передавать ArenaManager, а не наоборот.
 
Если тебе сложно освоить гитхаб, установи приложение для пк https://desktop.github.com
Все в автоматическом режиме будет из гуи оболочки.

Дело в том что я юзаю Eclipse а не intellij idea
Просто потому что комп не тянет :(
А кодить хочется, не для публикации а чисто для себя, работает как антистресс или коротание времени. Гуглил но там всё через intellij idea а не через Eclipse.
 
Сделал правильно, но с точностью до наоборот.
Мы не передаем ArenaManager все зависящие от него классы (в твоем случае это команда), а передаем зависящим от ArenaManager классам его объект. Таким образом, в конструкторе класса с командой нужно передавать ArenaManager, а не наоборот.


То-есть так?
класс с командой.
Код:
private ArenaManager arenaManager;

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

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

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

Геттеры и Сеттеры ты серьёзно? я знаю что это и с чем его едят, мне нужно совсем другое!!!
 
Последнее редактирование:
Да какая разница для себя или нет, гитхаб сохраняет код от утраты и сохраняет историю версий.
Не имеет значение через какую иде ты кодишь еклипс или идеа. Можешь скачать приложение гитхаб и юзать его. Если тебе сложно настроить еклипс напрямую для работы с гитхабом.

Я это и имел ввиду, гугля в ютубе как напрямую работать с гитом через екслипс, там ролики за 5+ лет.
А так у меня есть прога эта с гита, не разобрался ещё как загружать код туда, дело времени
 
Всем спасибо за ваши ответы <3

ТЕМА ЗАКРЫТА!
 
Статус
Закрыто для дальнейших ответов.

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

Назад
Верх