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

Стартап Как обратиться к главному классу через другой класс

Тема в разделе "Разработка плагинов для новичков", создана пользователем Zlodey_duo, 12 апр 2022.

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

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

    Баллы:
    66
    Имя в Minecraft:
    _X_ZLODEY_X_
    Очень часто вижу сообщения в просьбе о помощи, как обратиться к главному классу дабы получить конфиг? (Обратиться к конфигу).

    Сделать это очень просто :D

    Вам нужно написать следующий код в главном классе:
    Код:
           
        private static Main plugin;
        public static Main getInstance() { return plugin; }
    
        public void onEnable() {
                plugin = this;
    }
    
    Готово)

    Теперь как обратиться к главному классу, в моём примере это Main.

    Код:
    Main.getInstance()
    
    после instance() через точку мы можем к примеру получить конфиг

    Код:
    Main.getInstance().getConfig();
    
    (!!!) Знающие люди, если как-то можно упростить код и т.п. Напишите, пусть начинающие учатся.
    (!!!) Не судите строго :D
     
    Последнее редактирование: 12 апр 2022
  2. SashaBrine

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

    Баллы:
    76
    Имя в Minecraft:
    IJustFortiLive
    Чему ты учишь людей надо getInstance
     
  3. Автор темы
    Zlodey_duo

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

    Баллы:
    66
    Имя в Minecraft:
    _X_ZLODEY_X_
    А разница?
     
  4. SashaBrine

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

    Баллы:
    76
    Имя в Minecraft:
    IJustFortiLive
    Загугли "Java конвенция"
    И ищи там методы
    upload_2022-4-12_19-3-24.png
     
  5. Автор темы
    Zlodey_duo

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

    Баллы:
    66
    Имя в Minecraft:
    _X_ZLODEY_X_
    Спасибо за критику, исправил.
     
  6. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Это не лучший способ обращаться к объекту плагина. Использовать такой способ стоит только в крайнем случае.
    В большинстве ситуаций достаточно передавать главный класс плагина в конструкторы менеджеров
     
  7. SashaBrine

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

    Баллы:
    76
    Имя в Minecraft:
    IJustFortiLive
    Это второй способ но например к static методам ты что будешь передавать объект плагина?
     
  8. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Static методы тоже должны использоваться в исключительных случаях - фактически только для утилит. А инстанс плагина там, как правило, и не нужен. Случаи получения плагина статикой есть, но они довольно редки. И в целом нет проблемы в утилитарные методы передавать инстанс чего-либо.
    Но вопрос - что мешает сделать такой метод нестатическим методом?

    Но опять же, в большинстве случаев необходимо руководствоваться принципом единой ответственности, иначе можно получить большие проблемы с архитектурой
     
  9. SashaBrine

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

    Баллы:
    76
    Имя в Minecraft:
    IJustFortiLive
    Код:
    package com.company.mytopplugin;
    
    public class LoadUtil {
        public static void loadCommands() {
           
        }
    }
     
  10. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Для чего этот метод статический и вынесен в утилиты?
     
  11. SashaBrine

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

    Баллы:
    76
    Имя в Minecraft:
    IJustFortiLive
    Грузит команды и устанавливает их экзекьюторы

    Вот пример:
    Код:
    public class LoadUtil {
        private static Main plugin;
        static {
            this.plugin = Main.getInstance();
        }
     
        public static void loadCommands {
            plugin.getCommand("maincommand").setExecutor(new MainCommand());
        }
    }
     
    Последнее редактирование: 13 апр 2022
  12. alexandrage

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

    Баллы:
    173
    Дичайший говногодинг.
     
    Последнее редактирование: 13 апр 2022
  13. SashaBrine

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

    Баллы:
    76
    Имя в Minecraft:
    IJustFortiLive
    Что тебе не понравилось?)))
     
  14. MurlikMurlik

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

    Баллы:
    96
    Раз на то пошло, блок инициализации static можно вообще не использовать для инициализации статичной переменной, просто используй
    Код:
    private static Main plugin = Main.getInstance();
    Это тоже самое и будет короче.
    Кроме этого, это все не имеет смысл, так как проще получить инстанс сразу у Main класса и не городить лишние ненужные переменные.
    Код:
    Main.getInstance().getCommand("maincommand").setExecutor(new MainCommand());
     
  15. alexandrage

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

    Баллы:
    173
    Или писать по человечески передав переменную в конструктор нужному классу.
     
  16. Reality_SC

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

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    Плюс скорее всего ещё и работать точно также не будет, если случайно загрузка класса дёрнется до onEnable плагина.

    Самый корректный способ не умереть в лапше в будущем, как уже сказали выше, SPR и передача инстанса плагина в твой класс через конструктор.
     
  17. SashaBrine

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

    Баллы:
    76
    Имя в Minecraft:
    IJustFortiLive
    Вообще то нет я собираюсь писать этот метод как раз в onEnable
    Код:
    public void onEnable() {
        plugin = this;
        LoadUtil.loadCommands();
    }
     
  18. Sergeo

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

    Баллы:
    76
    Имя в Minecraft:
    Solomka
    Не лучший код, но все же
    Код:
        public void registrationCmd(CommandExecutor[] executors, String... commands) {
            if(executors.length == 1) {
                for(String command : commands) {
                    plugin.getCommand(command).setExecutor(executors[0]);
                }
            } else {
                for (int i = 0; i < executors.length; i++) {
                    plugin.getCommand(commands[i]).setExecutor(executors[i]);
                }
            }
            Messages.logger("(COMMANDS) >> Registered commands: " + commands.length);
        }
    
     
  19. SashaBrine

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

    Баллы:
    76
    Имя в Minecraft:
    IJustFortiLive
    Так тоже можно
     
  20. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Не только можно, но и нужно. О проблемах статики сказано выше
     
Статус темы:
Закрыта.

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