Android開発で注意すべきJavaオブジェクトのライフサイクルについてをまとめる

Android開発におけるライフサイクルの概念

iOSではViewControllerやViewクラスにライフサイクルの概念があって、 オートレイアウトの設定などで非常にややこしかったのです。 なので、Androidの場合はどうなのだろうかと疑問に思っていた。 Android にもActivityにライフサイクルがあることは既知であったのだが、 言語仕様にもライフサイクルがあるというのが本日初めて知った。

もしかするとObjective-CやSwiftにも実は意識してなかったけど、 オブジェクトのライフサイクルがあったのかもしれません。

そのためmJava言語におけるライフサイクルをまとめておきます。

3種類のJavaのライフサイクル

大きく分けて3種類のオブジェクトのライフサイクルがある。

 - ローカル変数  - インスタンス変数  - クラス変数

ローカル変数

ローカル変数は、処理のブロック内でのみ利用可能な変数のことである。

int sampleMethod() {
    int count = 0; // ローカル変数
    return count;
}

変数を宣言した箇所で生成されて、ブロックの処理が完了した時点で破棄される。

インスタンス変数

インスタンス変数は、クラスのフィールドとして宣言する変数のことである。 インスタンス変数のライフサイクルはクラスのインスタンスのライフサイクルと同じで、 親オブジェクトが生成された時に生成され、親オブジェクトがガベージコレクションされる時に破棄される。 ガベージコレクションとは、プログラムが確保したメモリ領域のうち、不要になった領域を解放する仕組みである。

クラス変数

クラス変数は、クラスのstaticフィールドとして宣言される変数のこと。 もっとも長いライフサイクルをもつ。 クラスロード時に生成されて破棄されるときに一緒に破棄される。

public class LifeCycleSample {
  public static int classVariable = 1; // クラス変数
  public int instanceVarialbe = 1;     // インスタンス変数

  public void sampleMethod() {
    int localVariable = 1;            // ローカル変数
    return localVariable;
  }
}

ライフサイクルのグッドプラクティス

変数オブジェクトの宣言に関するグッドプラクティスは概ね2パターン。

  1. ライフサイクルを短くする。
  2. ライフサイクルを長くして性能をあげる。

僕自身はこれまでの現場では変数は必要な箇所で宣言してスコープは最小限に抑えるようにしてきた。 あまりに長く保持していると、別の箇所から意図しないタイミングでその変数が呼び出されて状態が変わったりするのである(笑)。 意図しないプログラムはバグを生む要因になるのは明快であるのでなるべく避けるべき。

なので、僕にとっては1のライフサイクルは短くするパターンがやりやすいかなと思います。