- PR -

変数の宣言の場所について教えてください。

投稿者投稿内容
K
大ベテラン
会議室デビュー日: 2004/04/07
投稿数: 174
投稿日時: 2005-10-27 14:23
引用:

インスタンスイニシャライザについて検索してみたのですがコンストラクタより先に
実行される初期処理のようなものだと載っておりました。
コンストラクタと別になると何かメリットがあるのかな?と単純に思ってしまったの
ですが他の方が書いたソースで以下のようなものがありました。static{}という部分
がインスタンスイニシャライザにあたるのでしょうか?


コード:
static {
// なんか処理
}


はインスタンスイニシャライザではなくスタティックイニシャライザですね。
staticな場合はクラスロード時に実行されます。
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2005-10-27 14:55
引用:

S_Tatsuさんの書き込み (2005-10-27 14:12) より:
インスタンスイニシャライザについて検索してみたのですがコンストラクタより先に
実行される初期処理のようなものだと載っておりました。
コンストラクタと別になると何かメリットがあるのかな?と単純に思ってしまったの
ですが他の方が書いたソースで以下のようなものがありました。static{}という部分
がインスタンスイニシャライザにあたるのでしょうか?


インスタンス初期化子は、実際のソースではほとんどお目にかかれないと思います。
インスタンスの初期化はご指摘の通り通常はコンストラクタで行うので、インスタンス初期化子
を使うとすると、コンストラクタが書けないクラス、つまり匿名内部クラスぐらいしか使い道
はないでしょう。
ほまらら
ベテラン
会議室デビュー日: 2005/10/19
投稿数: 54
投稿日時: 2005-10-27 17:06
引用:

コンストラクタと別になると何かメリットがあるのかな?と単純に思ってしまったの
ですが




インスタンスイニシャライザは、コンストラクタを使用できないような状況以外では余り意味が無いようですね。

匿名クラスのようにクラス名がないからコンストラクタが書けないような状況では、使ったような気もします。
そういう意味では、GUI向けの構文と言えるでしょう。(GUIはイベント実装のために匿名クラスをガンガン使いますから)
混乱させるようなことを言って申し訳ありません。

無理やりな例ですが、下のようなのがいわゆる匿名クラス、、、になるんでしょうか?
なにぶん独学ばかりですので、間違っているかも。
public static void main(String[] args)
{
Thread _t = new Thread(){
ArrayList _al = null;
{
_al.append("a");
_al.append("b");
_al.append("c");
}

run(){
try
{
Thread.sleep(2000);
}
catch(Exception _e)
{
}
if(_al.contains("a"))
{
System.out.println("ok");
}else
{
System.out.println("no");
}
}
};

_t.start();
System.out.println("go");
}
ina
ベテラン
会議室デビュー日: 2005/04/14
投稿数: 58
投稿日時: 2005-10-28 22:56
inaです。
かなり前の書き込みに関するコメントですが....
引用:

komeyさんの書き込み (2005-10-26 13:13) より:
私は、switch-case文を使う際はできるだけ各caseに{}を付けるようにしています。
文法上、case文には{}は要らないので、各caseで変数を共有することができますが、そうしてしまうとswitch-case文に慣れていない人はスコープを見誤ることがあるためです。
変数を共有したい場合は、switch文の前に宣言しています。



{}をつけてまで、変数のロケールを明確に分ける必要があるってことは、{}内は、明確な責務を持ったロジックのブロックのはずですよね?
であれば、{}内をprivateメソッドとして切り出すべきと思うんですが.....

komey
ベテラン
会議室デビュー日: 2003/11/27
投稿数: 76
投稿日時: 2005-10-31 12:27
ukさんのコメントに返信しておけば良かったですね。すみません。
ukさんのご指摘の通り、組み込み系や携帯では、このようなコーディングをすることがあります。

引用:

inaさんの書き込み (2005-10-28 22:56) より:
{}をつけてまで、変数のロケールを明確に分ける必要があるってことは、{}内は、明確な責務を持ったロジックのブロックのはずですよね?
であれば、{}内をprivateメソッドとして切り出すべきと思うんですが.....



仰る通りです。
ただ、特別な環境(搭載できるアプリの容量に制限がある環境)では、メソッドを作ったときのオーバーヘッドが惜しいぐらい、容量を削りたい場合があります。
その場合、ロジックは一つのメソッドに押し込めます。
なので、このようなコーディングにせざるを得ないです。


うーん、このスレで何の前提もなくswitchでの{}の使い方を示すには不適切でしたね。。。気が回りませんでした。申し訳ないです。

スキルアップ/キャリアアップ(JOB@IT)