если еще условие в конструкторе класса ... это хорошая практика? - PullRequest
3 голосов
/ 30 марта 2011

Я написал конструктор и передал один логический флаг, чтобы решить, какое значение установить в переменную класса.Код выглядит следующим образом:

public PDFParagraph(PDFPhrase phrase,boolean isRtl) {
            super(phrase);
            if(isRtl)
                    this.setAlignment(Element.ALIGN_RIGHT);
            else
                    this.setAlignment(Element.ALIGN_LEFT);
    }

Теперь я запутался и не уверен, буду ли я добавлять условия if ... else в конструктор.Это хороший стиль, чтобы установить значение переменной класса?

Спасибо, Хануман.

Ответы [ 5 ]

5 голосов
/ 30 марта 2011

Условные выражения в конструкторах сами по себе не являются проблематичными.Однако в этом случае я был бы склонен написать ваш конструктор так:

public PDFParagraph(PDFPhrase phrase, boolean isRtl) {
    super(phrase);
    setAlignment(isRtl ? Element.ALIGN_RIGHT : Element.ALIGN_LEFT);
}
2 голосов
/ 30 марта 2011

Нет проблемы стиля с использованием if / else для этого.Однако:

  • Вы можете написать это более просто:

    setAlignment(isRtl ? Element.ALIGN_RIGHT : Element.ALIGN_LEFT);
    
  • Многие люди (включая меня) считают, что вы должны всегда ставитьфигурные скобки вокруг операторов «then» и «else».


В связи с этим: если вы обнаружите, что пишете конструктор, который выглядит следующим образом:

public Thing(boolean cond, ...) {
    super(...);
    if (cond) {
        // Lots of statements
    } else {
        // Lots of different statements
    }
    ...
}

это, возможно, признак того, что вам нужно реорганизовать ваши конструкторы.(Или, возможно, нет ... это зависит от деталей.)

1 голос
/ 30 марта 2011

Конечно, вы можете добавить оператор if / else в конструктор.

Обычно рекомендуется держать методы как атомарные (короткие и точечные) и четко определенные, насколько это возможно. Это касается и конструктора. Вы хотите, чтобы конструктор установил ваш объект, учитывая параметры, которые вы передаете.

Если вам нужен if / else, вы можете вставить его. Вы даже можете сойти с ума и вставить цикл, если вам нужно! ;)

1 голос
/ 30 марта 2011

Для пользователей вашего конструктора может быть более понятным, если вы просто передадите начальное выравнивание в set, особенно если это Enum и это единственные возможности. Однако, если вы пытаетесь ограничить начальное выравнивание и это что-то вроде String, то, что вы делаете, кажется нормальным. Вы все еще можете рассмотреть Enum для ясности, хотя. Это проще для чтения, чем true или false, передаваемые в конструктор.

0 голосов
/ 30 марта 2011

Я бы рекомендовал вам использовать enum и оператор switch вместо логического значения. Что происходит, когда вы добавляете другое выравнивание?

...