Обеспечить присутствие конструктора без аргументов во время компиляции (Java) - PullRequest
2 голосов
/ 29 апреля 2009

У меня класс примерно такой:

public class Test {

    private final List<ISomeType> things = new LinkedList<ISomeType>();

    public <T extends ISomeType> Test(Class<T> clazz, int order) {
        for (int i = 0; i < order; i++) {
            try {
                this.things.add(clazz.newInstance());
            } catch (Exception e) { 
                // stackoverflowers use your imagination
            }
        }
    }
}

Где я ожидаю и надеюсь, что класс Classz имеет доступный конструктор без аргументов. Можно ли как-нибудь обеспечить его наличие во время компиляции?

Ответы [ 6 ]

4 голосов
/ 29 апреля 2009

Нет способа обеспечить соблюдение требований конструктора во время компиляции. Во время выполнения вы можете проверить class.getConstructors () и убедиться, что есть такой, у которого нет аргументов (или просто перехватите исключение, как в примере кода).

Обычно требование конструктора без аргументов просто указано в Javadoc базового класса или интерфейса.

2 голосов
/ 29 апреля 2009

Как насчет этого?

interface Provider<T> {
   T get();
}

public class Test {

    private final List<ISomeType> things = new LinkedList<ISomeType>();

    public <T extends ISomeType> Test(Provider<T> provider, int order) {
        for (int i = 0; i < order; i++) {
            try {
                this.things.add(provider.get());
            } catch (Exception e) { 
                // stackoverflowers use your imagination
            }
        }
    }
}
2 голосов
/ 29 апреля 2009

Существуют некоторые инструменты для проверки стиля кода, которые можно расширить для проверки этого типа требований. Для затмения (и других) вам может помочь PMD . Глядя на учебник, я думаю, что вы сможете написать конкретное правило для проверки конструкторов без каких-либо параметров.

1 голос
/ 29 апреля 2009

Ссылка ниже показывает, как решить подобную ситуацию (проверяя, все ли подклассы определенного класса имеют конструктор без аргументов), используя Java 6 и инструмент обработки аннотаций:

Инструмент обработки аннотаций

Возможно, вы сможете адаптировать их решение для решения вашей проблемы.

1 голос
/ 29 апреля 2009

Лучше всего создать модульный тест, который проверяет это для каждого интересующего вас класса, а затем запустить модульные тесты во время сборки. Кроме того, вы можете создать тестовый класс - не распространяемый вместе с вашим кодом - который ничего не делает, кроме использования конструкторов без аргументов тех классов, которые вам нужны. Не отличный вариант.

0 голосов
/ 29 апреля 2009

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

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