web-dev-qa-db-ja.com

変数を初期化するためのベストプラクティスは何ですか?コンストラクターの外部または内部?

私は最高のコーディング標準/プラクティスを使用しようとしますが、グーグルとクラスのすべてで、以下の例のように変数を宣言/定義するための適切な形式を学習したことがありません。多くの異なる人々(教師、クラスメート、同僚)が、コンストラクターの内部と外部で変数をランダムに定義しているのを見ました。これに関するどんな情報でも素晴らしいです!

class Foo
{
    private static int firstNumber = 1;
    private int secondNumber = 25;
    private FooBar fooBar = new FooBar();

    public Foo()
    {
    }
}

または

class Foo
{
    private static int firstNumber;
    private int secondNumber;
    private FooBar fooBar;

    public Foo()
    {
        firstNumber = 1;
        secondNumber = 25;
        fooBar = new FooBar();
    }
}
3
Paul Gildehaus

いくつかの変数を「静的」に宣言したとすると、最初のオプションを使用します。

静的変数はクラスの1つのインスタンスにバインドされていません-それらはすべての変数で共有されています。インスタンスを作成する前に存在します。

2番目は、コンストラクターでそれらを初期化します。つまり、コンストラクターを呼び出すまで、それらの値は目的の値に設定されません。コンストラクターを呼び出すたびに、コンストラクターが再度初期化されます。

最初のオプションはより単純で、期待どおりに動作します。

7
Simon B

お気づきのように、人によって方法は異なります。これには「ベストプラクティス」がないためです。それは本当にスタイルの問題です。

私はあなたのコードがC#であることを想定しています。その特定の言語については、空のコンストラクターはここでは目的を果たさないので、最初のバージョンの簡略化された形式を選択します(定義しない場合、無料でこのようなデフォルトのコンストラクターを取得します)。

class Foo
{
    private static int firstNumber = 1;
    private static int secondNumber = 25;
    private FooBar fooBar = new FooBar();
}

私にとっては、フィールドが一緒に定義および割り当てられるため、コードが単純になります。デフォルト値を確認するために、フィールドからコンストラクターにファイルをジャンプする必要はありません。

しかし、他の人々はあなたの2番目のオプションを好むために同様に有効な個人的な理由があります。

したがって、コーディングのベストプラクティスは一貫性です。好きなスタイルを選び、それに固執してください。ランダムに見えるように2つを切り替えることはお勧めできません。

注意:必要に応じて2つを組み合わせる必要がある場合があります。プラグマティズムは常にここで原則に勝つ必要があるので、それらを混合する必要がある場合はそうします。必要がなければ混合しないでください。

2
David Arno

変数が初期化される場所は、そのスコープと使用目的によって異なります。

静的フィールド

宣言と初期化を一緒に保つために、それらを宣言するときにデフォルト値を設定します。

class Foo {
    private static int firstNumber = 1;
}

インスタンスフィールド

デフォルト値が常にすべてのインスタンスで同じである場合、宣言に初期化を含めることには何の問題もありません。

class Foo {
    private FooBar fooBar = new FooBar();
}

初期値が他の初期化ロジックに基づいて変化したり、コンストラクターに渡されたりする可能性がある場合は、コンストラクターで値を設定します。 fooBarを作成するときにFooの値を気にする必要があるかどうかを自問しています。

class Foo {
    private FooBar fooBar;

    public Foo(int number) {
        fooBar = new FooBar();
        fooBar.Size = number;
    }
}
1
Dan Wilson