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

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

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

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
 
Последнее редактирование:
Это не лучший способ обращаться к объекту плагина. Использовать такой способ стоит только в крайнем случае.
В большинстве ситуаций достаточно передавать главный класс плагина в конструкторы менеджеров
 
Это не лучший способ обращаться к объекту плагина. Использовать такой способ стоит только в крайнем случае.
В большинстве ситуаций достаточно передавать главный класс плагина в конструкторы менеджеров
Это второй способ но например к static методам ты что будешь передавать объект плагина?
 
Это второй способ но например к static методам ты что будешь передавать объект плагина?
Static методы тоже должны использоваться в исключительных случаях - фактически только для утилит. А инстанс плагина там, как правило, и не нужен. Случаи получения плагина статикой есть, но они довольно редки. И в целом нет проблемы в утилитарные методы передавать инстанс чего-либо.
Но вопрос - что мешает сделать такой метод нестатическим методом?

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

Но опять же, в большинстве случаев необходимо руководствоваться принципом единой ответственности, иначе можно получить большие проблемы с архитектурой
Код:
package com.company.mytopplugin;

public class LoadUtil {
    public static void loadCommands() {
       
    }
}
 
Для чего этот метод статический и вынесен в утилиты?
Грузит команды и устанавливает их экзекьюторы

Вот пример:
Код:
public class LoadUtil {
    private static Main plugin;
    static {
        this.plugin = Main.getInstance();
    }
 
    public static void loadCommands {
        plugin.getCommand("maincommand").setExecutor(new MainCommand());
    }
}
 
Последнее редактирование:
Грузит команды и устанавливает их экзекьюторы

Вот пример:
Код:
public class LoadUtil {
    private static Main plugin;
    static {
        this.plugin = Main.getInstance();
    }
 
    public static void loadCommands {
        plugin.getCommand("maincommand").setExecutor(new MainCommand());
    }
}
Дичайший говногодинг.
 
Последнее редактирование:
Что тебе не понравилось?)))
Раз на то пошло, блок инициализации static можно вообще не использовать для инициализации статичной переменной, просто используй
Код:
private static Main plugin = Main.getInstance();
Это тоже самое и будет короче.
Кроме этого, это все не имеет смысл, так как проще получить инстанс сразу у Main класса и не городить лишние ненужные переменные.
Код:
Main.getInstance().getCommand("maincommand").setExecutor(new MainCommand());
 
Кроме этого, это все не имеет смысл, так как проще получить инстанс сразу у Main класса и не городить лишние ненужные переменные.
Или писать по человечески передав переменную в конструктор нужному классу.
 
Раз на то пошло, блок инициализации static можно вообще не использовать для инициализации статичной переменной, просто используй
Код:
private static Main plugin = Main.getInstance();
Это тоже самое и будет короче.
Плюс скорее всего ещё и работать точно также не будет, если случайно загрузка класса дёрнется до onEnable плагина.

Самый корректный способ не умереть в лапше в будущем, как уже сказали выше, SPR и передача инстанса плагина в твой класс через конструктор.
 
Плюс скорее всего ещё и работать точно также не будет, если случайно загрузка класса дёрнется до onEnable плагина.
Вообще то нет я собираюсь писать этот метод как раз в onEnable
Код:
public void onEnable() {
    plugin = this;
    LoadUtil.loadCommands();
}
 
Грузит команды и устанавливает их экзекьюторы

Вот пример:
Код:
public class LoadUtil {
    private static Main plugin;
    static {
        this.plugin = Main.getInstance();
    }
 
    public static void loadCommands {
        plugin.getCommand("maincommand").setExecutor(new MainCommand());
    }
}
Не лучший код, но все же
Код:
    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);
    }
 
Не лучший код, но все же
Код:
    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);
    }
Так тоже можно
 
Статус
Закрыто для дальнейших ответов.

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

Назад
Верх