2015-02-26 3 views
1

Если у меня есть что-то вроде кода ниже в качестве конструктора, существует ли простой, сокращенный способ выполнения всех инициализаций переменных экземпляра в одной строке, если все их имена совпадают с именами параметров?Инициализация конструктора переменных экземпляра

private Quiz(int id, String name, int creatorId, Date timeCreated, 
     int categoryId, boolean randomOrder, boolean multiPage, 
     boolean immediateCorrection, boolean allowPractice) { 
    this.id = id; 
    this.name = name; 
    this.creatorId = creatorId; 
    this.timeCreated = timeCreated; 
    this.categoryId = categoryId; 
    this.randomOrder = randomOrder; 
    this.multiPage = multiPage; 
    this.immediateCorrection = immediateCorrection; 
    this.allowPractice = allowPractice; 
} 
+0

Я думаю, что нет способа. Но я могу ошибаться. –

+2

Вы используете весну? –

+1

Возможный дубликат [Могу ли я получить имя параметра метода с использованием отражения Java?] (Http://stackoverflow.com/questions/2237803/can-i-obtain-method-parameter-name-using-java-reflection) – alfasin

ответ

4

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

Однако все современные IDE (например, IntelliJ IDEA, Eclipse и т. Д.) Могут создавать такие конструкторы автоматически на основе переменных экземпляра, поэтому вам не нужно писать такой код вручную. (Например, в IntelliJ IDEA нажмите Alt + Insert, выберите Constructor, выберите переменные, которые вам нужны, и код конструктора будет создан).

Кроме того, если у вас есть так много переменных, которые необходимо передать и инициализировать в конструкторе (и особенно если не все из них необходимы) - рассмотрите использование Patter Builder (к сожалению, вам придется писать еще больше кода!). Вот пример того, как реализовать Builder: http://www.javacodegeeks.com/2013/01/the-builder-pattern-in-practice.html

2

Нет, но вы должны обратиться к подходу builder, так как там есть много parameters/arguments.

builder сделает создание объекта доступным, уменьшит вероятность ошибок и поможет в обеспечении безопасности потоков.

Посмотрите на When would you use the Builder Pattern? для деталей и образцов.

+0

Я не согласен. Шаблон Builder обычно используется для подключаемых компонентов внутри класса. Я не вижу здесь ничего такого. – TheLostMind

+0

Отлично, но, пожалуйста, взгляните на ссылку. Все подробности здесь особенно читаются в заявлении г-на Блоха, выписанного из «Эффективной Явы». – Khanna111

0

Вы можете использовать фабричный метод, который действует как конструктор, но фактически возвращает анонимный подкласс основного класса. Методы анонимного подкласса могут обращаться к параметрам фабричного метода, если они объявлены окончательными. Поэтому этот метод можно использовать только для полей, которые никогда не меняются.

import java.util.Date; 

abstract class Quiz{ 

    static Quiz newQuiz(final int id, final String name, final int creatorId, final Date timeCreated, 
         final int categoryId, final boolean randomOrder, final boolean multiPage, 
         final boolean immediateCorrection, final boolean allowPractice) { 

    // Return anonymous subclass of Quiz 
    return new Quiz(){ 

     @Override 
     public String someMethod() { 
     // Methods can access newQuiz parameters 
     return name + creatorId + categoryId + timeCreated; 
     } 

     @Override 
     public boolean someOtherMethod() { 
     // Methods can access newQuiz parameters 
     return randomOrder && multiPage && allowPractice; 
     } 

    }; 
    } 

    public abstract String someMethod(); 
    public abstract boolean someOtherMethod(); 


    public static void main(String[] args) { 
    Quiz quiz = Quiz.newQuiz(111, "Fred", 222, new Date(), 333, false, true, false, true); 
    System.out.println(quiz.someMethod()); 
    System.out.println(quiz.someOtherMethod()); 
    } 

} 
1

Проект Lombok содержит ряд аннотаций класса, которые вы можете добавить в свой класс, которые будут генерировать конструкторы, которые вы описываете. Посмотрите на @NoArgsConstructor, @RequiredArgsConstructor и @AllArgsConstructor здесь:

https://projectlombok.org/features/index.html

Другие аннотации доступны в Ломбок являются так же волшебно для удаления шаблонного из классов, посмотрите. Lombok является фантастическим, и IntelliJ Idea имеет хорошую поддержку плагинов для отладки и тестирования классов, аннотированных Lombok.

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