Хостинг серверов Minecraft playvds.com
  1. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на русский язык плагины наших собратьев из других стран.
    Скрыть объявление

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

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

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

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

    Баллы:
    96
    Skype:
    thecoolboy2070
    Имя в Minecraft:
    CoolBoy
    Господа, знатоки, доброго времени суток.

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

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

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

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

    Код:
    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);
                }
            }
        }
    }
    
    Помидорами прошу не кидатся, просто нужен чужой опыт. Хотелось бы знать, что это максимум, что можно сделать, в моей ситуации.
     
    Последнее редактирование: 8 июл 2016
  2. Хостинг MineCraft
    <
  3. MrTrojan

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

    Баллы:
    98
    Skype:
    mrtrojan.ru
    Имя в Minecraft:
    MrTrojan
    Создаю класс Config, дальше передаю в конструктор Config'a конфиг (new Config(getConfig())) и дальше в конструкторе, ссылки на переменные делаю статистическими:
    Код:
    public Config(FileConfiguration config) {
        example = config.getString("example");
    }
     
  4. Автор темы
    CoolBoy

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

    Баллы:
    96
    Skype:
    thecoolboy2070
    Имя в Minecraft:
    CoolBoy
    А с интерфейсом никак, да? :(

    Статические переменные же инициализируются во время обьявления?
     
  5. Larin

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

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

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

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

    Баллы:
    96
    Skype:
    thecoolboy2070
    Имя в Minecraft:
    CoolBoy
    Более 300 енум типов. Не очень круто, как по мне. Хотя, можно попробовать, спасибо.

    Someone else?
     
  7. Larin

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

    Баллы:
    103
    У тебя 300 конфигов?
     
  8. Reality_SC

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

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

    Интерфейс — это абстракция, не стоит к ним относиться как-то иначе.
    Ссылку на инстанс, не создавай сам инстанс, высрать обычно неоткуда.
     
  9. Автор темы
    CoolBoy

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

    Баллы:
    96
    Skype:
    thecoolboy2070
    Имя в Minecraft:
    CoolBoy
    Конфиг 1, а сообщений 326 штук.[DOUBLEPOST=1468000841,1468000599][/DOUBLEPOST]
    Спасибо. Ещё раз напомнили о том, что гитхаб в России заблокировали :(
     
  10. Reality_SC

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

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    Подумаешь, был недоступен сколько-то часов год назад.
    Так-то и торренты запретили, но ты ж наверное качаешь? )))
     
  11. Larin

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

    Баллы:
    103
    Я забил их в enum и прикрепил туда пару методов для удобства, вроде string substitutor'а и колоризатора.
     
  12. Автор темы
    CoolBoy

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

    Баллы:
    96
    Skype:
    thecoolboy2070
    Имя в Minecraft:
    CoolBoy
    Да нет, там долгая история :)
    http://vk.com/wall-30666517_1384405[DOUBLEPOST=1468001829,1468001761][/DOUBLEPOST]Всем спасибо.

    Тема закрыта.
     
Статус темы:
Закрыта.

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