[Решено] Передача ссылки на главный класс интерфейсу

  • Автор темы Автор темы CoolBoy
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.

CoolBoy

Активный участник
Пользователь
Баллы
96
Имя в Minecraft
Xezard
Господа, знатоки, доброго времени суток.

Хотел бы задать небольшой вопрос.
Собственно, имею небольшой ряд, написанных мной больших плагинов.
И я подумал, что было-бы неплохо хранить все сообщения в интерфейсе. Переменные (константы) в интерфейсе всегда static final.
Это значит что они не могут изменить значение и инициализируются только один раз. Это очень удобно.
Но есть небольшая проблема. Заключается она в том, что в интерфейсе нельзя создать конструктор. Если рассматривать отдельный случай, то имею плагин на 60 с лишним классов и на 300 (примерно) с лишним сообщений. Инициализирую эти сообщения в каждом классе через конструктор, что очень неудобно, так как некоторые сообщения я инициализирую для каждого класса отдельно. Это я всё к чему - на весь плагин не имею инстанса главного класса, так как всё держится на конструкторах.

Собственно, вопрос, можно ли как-либо передать ссылку на главный класс, не создавая при этом инстанс главного класса?

Ну и, пожалуй, сюда же добавлю:
У кого нибудь имеется опыт написания огромных плагинов?
Где вы сохраняете все сообщения и как инициализируете их?
Есть ли способ хранения всех сообщений проще?

Ну и то, что имею сейчас:

Java:
public class SomeClass
extends BaseListener
implements Listener
{
    private final Core core;

    private final String prefix;
    private final String you_cant_damage_villager;

    public SomeClass(Core core, FileConfiguration config)
    {
        super(core);
  
        prefix = config.getString("Messages.Prefix");
        you_cant_damage_villager = config.getString("Messages.You-cant-damage-villager");
    }

    @EventHandler
    public void onDamage(EntityDamageByEntityEvent event)
    {
        if (event.getEntity().getType() == EntityType.VILLAGER)
        {
            if (event.getDamager().getType() == EntityType.PLAYER)
            {
                event.getDamager().sendMessage(prefix.concat(you_cant_damage_villager);
                event.setCancelled(true);
            }
        }
    }
}

Помидорами прошу не кидатся, просто нужен чужой опыт. Хотелось бы знать, что это максимум, что можно сделать, в моей ситуации.
 
Последнее редактирование:
Где вы сохраняете все сообщения и как инициализируете их?
Создаю класс Config, дальше передаю в конструктор Config'a конфиг (new Config(getConfig())) и дальше в конструкторе, ссылки на переменные делаю статистическими:
Java:
public Config(FileConfiguration config) {
    example = config.getString("example");
}
 
Создаю класс Config, дальше передаю в конструктор Config'a конфиг (new Config(getConfig())) и дальше в конструкторе, ссылки на переменные делаю статистическими:
Java:
public Config(FileConfiguration config) {
    example = config.getString("example");
}
А с интерфейсом никак, да? :(

Статические переменные же инициализируются во время обьявления?
 
А с интерфейсом никак, да? :(

Статические переменные же инициализируются во время обьявления?
Нельзя в интерфейсе ничего хранить, интерфейс всего лишь содержит методы без тела(Внутренняя кухня JVM).
https://docs.oracle.com/javase/tutorial/java/concepts/interface.html

Используй enum для этого тогда.
P.S. сделал удобный конфигуратор на enum(добавляешь элемент enum'а и работаешь как с конфигом, очень удобно)
 
Нельзя в интерфейсе ничего хранить, интерфейс всего лишь содержит методы без тела(Внутренняя кухня JVM).
https://docs.oracle.com/javase/tutorial/java/concepts/interface.html

Используй enum для этого тогда.
P.S. сделал удобный конфигуратор на enum(добавляешь элемент enum'а и работаешь как с конфигом, очень удобно)
Более 300 енум типов. Не очень круто, как по мне. Хотя, можно попробовать, спасибо.

Someone else?
 
Не знаю, как другие используют enum, но я imho это делаю вполне лаконично.
Код списка сообщений (Phrases.java).
Переводы english и russian.
Использование в коде.

Интерфейс — это абстракция, не стоит к ним относиться как-то иначе.
Ссылку на инстанс, не создавай сам инстанс, высрать обычно неоткуда.
 
У тебя 300 конфигов?
Конфиг 1, а сообщений 326 штук.
Не знаю, как другие используют enum, но я imho это делаю вполне лаконично.
Код списка сообщений (Phrases.java).
Переводы english и russian.
Использование в коде.

Интерфейс — это абстракция, не стоит к ним относиться как-то иначе.
Ссылку на инстанс, не создавай сам инстанс, высрать обычно неоткуда.
Спасибо. Ещё раз напомнили о том, что гитхаб в России заблокировали :(
 
Спасибо. Ещё раз напомнили о том, что гитхаб в России заблокировали :(
Подумаешь, был недоступен сколько-то часов год назад.
Так-то и торренты запретили, но ты ж наверное качаешь? )))
 
Конфиг 1, а сообщений 326 штук.

Спасибо. Ещё раз напомнили о том, что гитхаб в России заблокировали :(
Я забил их в enum и прикрепил туда пару методов для удобства, вроде string substitutor'а и колоризатора.
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх