2009-04-29 1 views
2

У меня есть класс-то вроде этого:Принудителен наличие конструктора без аргументов во время компиляции (Java)

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 
      } 
     } 
    } 
} 

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

+1

Правильный термин - конструктор без аргументов. –

+0

Не знаю почему, но этот метод не выглядит Java-иш. – yihtserns

ответ

4

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

Обычно требование конструктора no-arg указано только в Javadoc базового класса или интерфейса.

-2

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

+0

-1 Ваш код будет работать, также с Reflection, если вы действительно понимаете, что делаете. Но вы правы, не нужно использовать Reflection без необходимости, поскольку вы теряете безопасность времени компиляции. – Ridcully

1

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

2

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

2

Что относительно этого?

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 
      } 
     } 
    } 
} 
1

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

Annotation Processing Tool

Возможно, вы можете приспособить свое решение, чтобы решить вашу проблему.

+0

Хорошая ссылка. Это вполне может быть ответом. –

Смежные вопросы