そこで変数を初期化する意味は?

無意味な変数初期化によって、メモリ消費量を無駄に増加させてしまっているコードをよく見かけます。

例えばこのように、変数を一旦初期化した後にメソッドの戻り値や別の変数で上書きしているコードです。
丁寧な書き方だと勘違いしているのかもしれませんが、これは行数とメモリ消費量が無駄に増えてしまうだけで、初期化する意味は全くありません。

・Java
ArrayList list = new ArrayList();
list = this.hogehoge(); 

・PHP
$sample = array();
$sample = $value;

 

これらの2つの例はどちらも、初期化でメモリ領域を確保した後に破棄するという無駄なことを行っています。

まず前者のJavaの例では、最初にnewで確保したメモリ領域とhogehogeメソッドの戻り値のメモリ領域は別物になります。
listの参照先はhogehogeメソッドで確保したメモリ領域に置き換えられ、最初にnewで確保したメモリ領域は破棄されてしまいます。

変数の宣言とメソッドの呼び出しを同時に行うか、どうしても初期化を入れたい場合はnullで初期化すべきです。

ArrayList list = this.hogehoge();

or

ArrayList list = null;
list = this.hogehoge();

 

後者のPHPの例でも、$valueの値で$sampleの値を上書いてしまうので、最初にarray()で確保したメモリ領域は使用されません。

そもそもPHPの場合は$valueが配列であるとは限りませんし、仮に配列だったとしても既に入っている空配列は無視して上書きされるので、いずれにしても最初に空配列として確保した分のメモリ領域は無駄になってしまいます。

 

ちなみに同じPHPの配列でも、以下のような初期化は推奨すべき丁寧な書き方です。

$sample = array();
$sample[0] = 'hogehoge';
$sample[1] = 'hogehoge2';

この場合は最初に確保した空配列に対して値を追加しているだけなので、メモリが無駄に消費されることはありません。
PHPの場合、この初期化を省略しても動いてしまいますが、これは省略せず丁寧に書くべきだと思います。

 

今回の例では変数初期化の直後に上書きしていたので比較的分かりやすかったと思いますが、間に別の処理が入ってしまうと分かりにくくなってしまいます。
間に別の処理が入るとその分、無駄な値を保持する時間も長くなってしまうので良くない事だらけです。

変数の宣言時に機械的に初期化をしていた方は、今まで無駄な初期化をしていなかったか見直してみた方がいいかもしれません。




コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です