2006/07/01(土) [n年前の日記]
#1 [java][iappli] 変数の初期化とかコンストラクタとか
iアプリのリジューム処理が、ある程度初期化が終わってからじゃないと実効されないようにするには、どうしたらいいのか。みたいな。
_インスタンス変数が初期化されていないみたいなのですが?
_インスタンス変数の初期化子とコンストラクタの実行順序はどうなっていますか?
_synchronized を使って、コンストラクタの実行が終る前に 別スレッドがそのオブジェクトのメソッドを呼べないようにできないでしょうか?
_メンバ変数の初期化
もしかして、int resumeEnable = 0; とかしておくと動作が違うのだろうか。ってそういう書き方をしても、結局は _コンストラクタ内で初期化するのと同じ ことのように見えるけど…。うーん。
リジューム処理じゃないところでエラーが出てるのかな…。うーん。
SH505iとかで不具合が出てるらしいのだけど、検索してもそれらしい話は見当たらず。自分が何かまずいことをしてる、のだろうな。
_インスタンス変数が初期化されていないみたいなのですが?
スーパークラスのコンストラクタがサブクラスのコンストラクタより先に呼び出されるため、スーパークラスのコンストラクタ内でサブクラスのメソッドを呼び出した場合、サブクラスのフィールドは初期化されていません。
_インスタンス変数の初期化子とコンストラクタの実行順序はどうなっていますか?
インスタンス変数の初期化子は、スーパークラスのコンストラクタの呼び出しの直後に実行されます。
_synchronized を使って、コンストラクタの実行が終る前に 別スレッドがそのオブジェクトのメソッドを呼べないようにできないでしょうか?
synchronized(this){...} により条件付きながら可能です。JavaFAQ: スレッド - thread(同期と排他制御 - synchronization / mutual exclusion) より
しかしこの方法はサブクラス化した時に、問題を起こす可能性が有ります。サブクラスのコンストラクタ(すなわち初期化)が終了しないうちに、メソッドが呼ばれる可能性が有るためです。JavaFAQ: スレッド - thread(同期と排他制御 - synchronization / mutual exclusion) より
_メンバ変数の初期化
メソッド内で定義される変数(ローカル変数)は、明示的に初期値を代入しておかないと利用できません。これに対して、メンバ変数の場合は明示的に初期化しなくても、暗示的に初期値が代入されます。但し、実際はどこかで明示的に初期化しておくものです。整数は 0 だし、boolean は false、だよな…。うーん。
◎ こういう感じにしてるのだけど。 :
public class HogeHoge extends IApplication {
Hoge m = new Hoge();
public void start() {
Display.setCurrent(m);
m.exec();
}
public void resume() {
m.resume();
}
}
class Hoge extends Canvas implements MediaListener {
int resumeEnable;
// コンストラクタ
public Hoge() {
resumeEnable = 0;
// 色々な初期化処理
}
// メインループとか
public void exec() {
while(true) {
switch(step) {
case 0:
// 初期化とかロードとか
step++;
break;
case 1:
resumeEnable = 1;
step++;
break;
case 2:
// ゲーム中の処理
break;
default:
break;
}
// 描画とか時間待ちとか
}
}
// リジューム処理
public void resume() {
if (resumeEnable == 0) return;
if (sound_disable) return;
// BGM関連の復帰再生処理
// 初期化とかロードとかが終わってないと
// サウンドデータが無い = 鳴らせないから
// それまではフラグを見て処理をスキップする。
}
}
何がまずいんだろう。アプリが起動するかしないかのタイミングで割り込みが入ったときにはエラーになる、てのがわからん。初期とかロードとかしてる最中に割り込みを入れる分にはエラーが出ないらしいのだが。もしかして、int resumeEnable = 0; とかしておくと動作が違うのだろうか。ってそういう書き方をしても、結局は _コンストラクタ内で初期化するのと同じ ことのように見えるけど…。うーん。
リジューム処理じゃないところでエラーが出てるのかな…。うーん。
SH505iとかで不具合が出てるらしいのだけど、検索してもそれらしい話は見当たらず。自分が何かまずいことをしてる、のだろうな。
[ ツッコむ ]
以上です。