2010-02-03 6 views
4

Это своего рода вопрос дизайна, и я уверен, что есть люди, которые делают это в обоих направлениях. Но, на ваш взгляд, лучше ли назначать переменную в классе или в конструкторе? Например (независимо от синтаксиса или языка, это просто объяснить):Лучше ли назначать переменные в самом классе или в конструкторе класса?

public class Example 
{ 
    private final int TIME_STAMP = Now(); 
    private int num = 2; 
} 

ИЛИ

public class Example 
{ 
    private readonly int TIME_STAMP; 
    private int num; 

    public Example() 
    { 
     TIME_STAMP = Now(); 
     num = 2; 
    } 
} 

Игнорируйте смеси разных языков и синтаксиса ... Что предпочтительнее и почему?

+0

Все предложения кажутся действительными ... Я предполагаю, что нет стандартной практики? – froadie

ответ

2

Инлайн (первый вариант):

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

    { 
        var1 = 5; 
        varTime = now(); 
    } 
    
+0

@Bozho - в чем преимущество блока инициализатора над просто помещением кода в класс (как первый вариант в моем вопросе)? – froadie

+0

в зависимости от предпочтений он может считаться более читаемым. – Bozho

4

В тенденцию:

  • Набор по умолчанию, постоянные значения в самом классе
  • и значения, зависящего от чего-то другого (например, текущее время) в конструкторе.


т.е. я предпочитаю использовать что-то вроде этого (присоединяемых ваших двух примеров):

public class Example 
{ 
    private readonly int TIME_STAMP; 
    private int num = 2; 

    public Example() 
    { 
     TIME_STAMP = Now(); 
    } 
} 

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

+0

yes, 'private readonly int TIME_STAMP = NOW();' лучше, если возможно – Bozho

+0

Голосовать, потому что мне нравится различие между значениями константы/значения по умолчанию и значениями переменных. Логичное, полезное различие, говорит. – doppelfish

+0

не является отличием от ключевого слова 'readonly'? – Bozho

1

Основная идея заключается в том, что вы вводите любой код запуска или инициализации для класса в конструкторе. В отличие от этого и логически, вы вводите любой код очистки в деструктор.

1

С точки зрения проверки, оба подхода являются проблематичными. За исключением констант, вы должны иметь конструктор, который принимает их как аргументы, или свойство, которое позволяет вам установить фоновое поле.
Как правило, я бы создал «полный» конструктор, который дает вам полный контроль над классом и пустой/стандартный конструктор, который вызывает другой, определяющий аргументы по умолчанию. Таким образом, все в одном месте, и мне не нужно заглядывать в задние поля, чтобы выяснить, что происходит во время строительства.

+0

Вот как я пишу свои конструкторы. Единственный момент, когда я создаю что-то, - это когда мне требуется экземпляр, чтобы гарантировать глобальный охват. –

0

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