ローカル変数のスコープ
ローカル変数とは、
private void execute() {
...
int total = 1; ┓変数totalのスコープ開始
... |
... |
for (int i = 1; i <= 10; i++) { |
int n = i * i; |┓変数nのスコープ開始
total += n; |┛変数nのスコープ終了
} |
... |
System.out.println(total); ┛変数トータルのスコープ終了
}
もう少し具体的な例を見てみましょう。リスト2はスコープが長いローカル変数の例です。変数open/
public boolean isClosing(Date now) {
Date open = null; ┓
Date close = null; ┛①
...
for(Timetable table : tables){
open = getDate(table.openDateString()); ┓
close = getDate(table.openCloseString()); |
if(contains(now, open, close)){ ┛②
return false;
}
}
...
return true; ―③
}
スコープを短く書き換えた例がリスト3です。ローカル変数open/
ローカル変数のスコープが小さくなると、
また、
public boolean isClosing(Date now) {
...
for(Timetable table : tables){
Date open = getDate(table.openDateString()); ┓
Date close = getDate(table.openCloseString()); ┛①
if(contains(now, open, close)){
return false;
} ―②
}
...
return true;
}
ローカル変数のスコープを小さくするガイドライン
次のガイドラインにより、
変数は使用する直前で宣言する
リスト3のように、
なお、
メソッドに抽出する
ある程度の固まりの処理を別メソッドに抽出するリファクタリングを行うと、
イテレータの一時変数のスコープをループ内に閉じ込める
一時変数とは一時的な入れ物として利用する変数です。リスト4)
Iterator iter = iterator();┓
while (iter.hasNext()) {|
Item item = (Item)iter.next();|
...|変数iterのスコープ
}|
// ここでも変数iterが参照できてしまう|
...┛
for (Iterator iter = iterator(); iter.hasNext(); ) { ┓
Item item = (Item)iter.next(); |変数iterのスコープ
... |
} ┛
// ここでは変数iterは参照できない
...
代入されない変数にはfinalを付ける
Javaでは変数宣言時にfinalを付けると、
final int count = getCount();
...
... ※長い処理
...
count = getTotalCount(); // コンパイルエラーが発生
なおC#では、
フィールド変数のスコープ
フィールド変数とはインスタンス変数のことです。フィールド変数のスコープは、
- private
- package private
- protected
- public
スコープが一番小さいprivateは、
「フィールド変数はすべてprivate」
// フィールド変数
private int count;
// セッタ
public void setCount(int count) {
this.count = count;
}
// ゲッタ
public int getCount() {
return this.count;
}
ただし、