Как динамически создавать вложенные объекты при чтении файла в Java? - PullRequest
0 голосов
/ 26 апреля 2018

Допустим, у меня есть текстовый файл, который включает в себя строку ниже.

Add apple banana strawberry

Когда я читаю строку и делю ее на пробелы. Я получаю apple, banana, strawberry и хочу создать вложенный объект с классами, которые я определил, и с использованием шаблона декоратора

new apple(new banana(new strawberry()))

Я пробовал это;

new splited[1](new splited[2](new splited[3]())))

но это не сработало. Как я могу создать это динамически, потому что каждая строка может включать в себя различное количество фруктов. Как я могу сделать это без использования операторов if для каждой комбинации, например, 2-х или 3-х вложенных?

1 Ответ

0 голосов
/ 26 апреля 2018

Это довольно легко, если все ваши плоды реализуют общий интерфейс.Гораздо сложнее, если они этого не делают, до такой степени, что я бы, вероятно, предложил вообще использовать другой язык.Java не подходит для этого.

Если они реализуют общий интерфейс, вы можете использовать Class.forName, чтобы получить класс, а затем getConstructor, чтобы иметь возможностьдля создания экземпляров объектов:

Базовый интерфейс (ваш, вероятно, объявил бы более полезное поведение):

public interface Fruit {
    String getName();
}

Apple:

public class Apple implements Fruit {
    private final Fruit child;

    public Apple(final Fruit child) { this.child = child; }

    @Override
    public String getName() {
        return "I am an apple " + (child == null ? "" : child.getName());
    }
}

Банан может быть в основном идентичным Appleпросто с другим именем.

Клубника:

public class Strawberry implements Fruit {
    @Override
    public String getName() {
        return "I am a strawberry";
    }
}

Основной метод приведен ниже.Нам нужно выполнить итерацию в обратном порядке по массиву, чтобы сначала построить дочерние объекты.

@SuppressWarnings("unchecked")
public static void main(final String... args) throws Exception
{
    String[] splitted = {"Apple", "Banana", "Strawberry"};
    Fruit prevFruit = null;
    for (int i = splitted.length - 1; i >= 0; --i)
    {
        final String className = splitted[i];
        final Class<? extends Fruit> clazz = (Class<? extends Fruit>) Class.forName("my.pckage." + className);
        if (prevFruit == null) // if first, use no-arg constructor
        {
            prevFruit = clazz.getConstructor().newInstance();
        }
        else
        {
            prevFruit = clazz.getConstructor(Fruit.class).newInstance(prevFruit);
        }
    }
    System.out.println(prevFruit.getName());
}

Пример вывода:

Я - яблоко Я - банан Я -клубника

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...