| ||||||||||||
| 前のページ 1 2 3 4 次のページ | ||||||||||||
| インスタンス変数 | ||||||||||||
インスタンス変数は決められた場所以外からアクセスできるようになっていると、プログラマのミスや勘違いでインスタンス変数に誤った値などをセットしてしまいバグにつながる可能性があります。インスタンス変数はアクセス権を意識して宣言するようにしましょう。 | ||||||||||||
| インスタンス変数初期化のタイミングは「コンストラクタ」または、「インスタンス変数宣言時」または、「初めて値がgetされるタイミング(LazyInitialization)」のいずれかにせよ(C_IVL001) | ||||||||||||
インスタンス変数の初期化のタイミングは、「コンストラクタ」「インスタンス変数宣言時」「初めて値がgetされるタイミング」という3通りが考えられます。それぞれのメリット・デメリットを下記に示します。 コンストラクタで初期化の場合 | ||||||||||||
public class Product { | ||||||||||||
表1:コンストラクタで初期化のメリット・デメリット ※注:スレッドセーフとは、マルチスレッド環境化で実行されても内部データへのアクセスが競合せずに、常に内部データの整合性が保たれているように対策されている状態のこと。 インスタンス変数宣言時で初期化の場合 | ||||||||||||
public class Product { | ||||||||||||
表2:インスタンス変数宣言時で初期化のメリット・デメリット 初めて値がgetされるタイミングで初期化の場合 | ||||||||||||
public class Product { | ||||||||||||
表3:初めて値がgetされるタイミングで初期化のメリット・デメリット | ||||||||||||
| 以上のように、インスタンス変数を初期化する3つの方法には、それぞれメリットとデメリットがあります。 使い分けの指針としては、インスタンス変数宣言と同時に初期化を行うことを基本にして、少々複雑な初期化が必要なインスタンス変数やインスタンスごとに値を変えなければならないものはコンストラクタで初期化を行い、滅多に利用されないインスタンス変数や初期化処理に時間がかかるものはgetメソッドで初期化を行うとよいでしょう。 | ||||||||||||
| インスタンス変数はprivateにする(C_IVL002) | ||||||||||||
インスタンス変数をpublicまたはデフォルト(package-private)にしてしまうと、そのインスタンス変数を他のクラスが直接アクセスできるようになるため、他のクラスが誤った値をセットして、そのインスタンスの内部状態を壊してしまうなどのトラブルが発生してしまいます。 しかし、インスタンス変数のアクセス修飾子をprivateにすることで、外部のクラスによるインスタンス変数の変更は、setメソッドによる値のセットに一本化されます。setメソッドの中では、不正な値がセットされようとしていないかをチェックするロジックを記述することも可能ですので、外部のクラスによって誤った値がセットされたとしてもエラーとして検出され、インスタンスの内部状態を常に正しく保つことができます。 | ||||||||||||
| 前のページ 1 2 3 4 次のページ | ||||||||||||
| ||||||||||||
| ||||||||||||

