Укажите, какую реализацию интерфейса Java использовать в аргументе командной строки

1

Скажем, у меня есть Java-интерфейс Blender.java с различными реализациями Cuisinart.java, Oster.java, Blendtec.java и т.д. Теперь я хочу написать такую программу:

public class Blendifier {
    // ...
    public static void main(String... args) {
        Blender blender = new Cuisinart();
        blender.blend();
    }
}

Но теперь, если я хочу использовать Blendtec вместо Cuisinart, я должен открыть источник, изменить код и перекомпилировать.

Вместо этого я хотел бы указать, какой Blender использовать "на лету", когда я запускаю программу, написав имя класса, которое я хочу в качестве аргумента командной строки.

Но как я могу перейти от String, содержащего имя класса, к созданию фактического экземпляра этого класса?

  • 2
    Отражение Или вы можете использовать DI-фреймворк, такой как Spring или Guice.
  • 0
    Отражение - это огромная тема, о которой я ничего не знаю - мне бы очень хотелось, чтобы кто-нибудь приблизил меня к тому, как я бы использовал его для решения этой конкретной проблемы ...
Показать ещё 1 комментарий
Теги:
interface
command-line-arguments
classname

2 ответа

1
Лучший ответ

Если вы не хотите преодолевать проблемы, которые являются отражением Java, вы можете написать простой статический заводский метод, который принимает строку и возвращает соответствующий объект.

public static Blender createBlender(String type){
    switch(type){
    case "Cuisinart": return new Cuisinart();
    case "Oster": return new Oster();
    //etc
    }
}

Затем вы просто передаете аргумент командной строки, и у вас будет все, что вам нужно.

Единственная возможная проблема с дизайном заключается в том, что вам придется вводить строку для каждого класса, который реализует Blender, поэтому вам придется обновить этот метод, если позже вы добавите больше типов.

0

У вас есть несколько способов сделать это:

например, конструкция if-else

Blender blender = null;
if (args[0].equals("Cuisinart")) {
   blender = new Cuisinart();
} else if (...)

где args [0] - ваш первый аргумент командной строки.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню