mieki256's diary



2006/07/01() [n年前の日記]

#1 [java][iappli] 変数の初期化とかコンストラクタとか

iアプリのリジューム処理が、ある程度初期化が終わってからじゃないと実効されないようにするには、どうしたらいいのか。みたいな。

_インスタンス変数が初期化されていないみたいなのですが?
スーパークラスのコンストラクタがサブクラスのコンストラクタより先に呼び出されるため、スーパークラスのコンストラクタ内でサブクラスのメソッドを呼び出した場合、サブクラスのフィールドは初期化されていません。

JavaFAQ: コンストラクタ - constructor より


_インスタンス変数の初期化子とコンストラクタの実行順序はどうなっていますか?
インスタンス変数の初期化子は、スーパークラスのコンストラクタの呼び出しの直後に実行されます。

JavaFAQ: コンストラクタ - constructor より


_synchronized を使って、コンストラクタの実行が終る前に 別スレッドがそのオブジェクトのメソッドを呼べないようにできないでしょうか?
synchronized(this){...} により条件付きながら可能です。

JavaFAQ: スレッド - thread(同期と排他制御 - synchronization / mutual exclusion) より

しかしこの方法はサブクラス化した時に、問題を起こす可能性が有ります。サブクラスのコンストラクタ(すなわち初期化)が終了しないうちに、メソッドが呼ばれる可能性が有るためです。

JavaFAQ: スレッド - thread(同期と排他制御 - synchronization / mutual exclusion) より


_メンバ変数の初期化
メソッド内で定義される変数(ローカル変数)は、明示的に初期値を代入しておかないと利用できません。これに対して、メンバ変数の場合は明示的に初期化しなくても、暗示的に初期値が代入されます。但し、実際はどこかで明示的に初期化しておくものです。

Java 入門 | メンバー変数 より

整数は 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とかで不具合が出てるらしいのだけど、検索してもそれらしい話は見当たらず。自分が何かまずいことをしてる、のだろうな。

#2 [iappli] _Mobile:イチから始める,iモードJavaプログラミング:第19回 「サウンドを鳴らす」

モグラクラスの場合,モグラをユーザーがヒットしたときと,モグラをヒットし損ねたときに音を出すようにした。ゲーム中にヒット/ミスヒットが連続して起こると,サウンド再生が重なってしまう。それでも,エミュレータでは問題がないのだが,実機では多少の問題が出ることがあった。そこで,リスト1に示したようにサウンド再生中にフラグを立て,別のサウンドを鳴らさないよう,制御している。

Mobile:イチから始める,iモードJavaプログラミング:第19回 「サウンドを鳴らす」 より

_サンプルソース を見ると、mediaAction() とか AudioPresenter.AUDIO_COMPLETE とか AudioPresenter.AUDIO_PLAYING 等でフラグ管理をしてるっぽい。そういうやり方のほうがいいのか、というより、そうしないといかんのか。

#3 [java] 何故、参照なんだろう

Java関連の解説ページでは、「参照」という単語を見かける。「住所」じゃいかんのかな。や、「住所」とは違うものかもしれんけど。そのへんよくわかってない。>自分。何にせよ、日常会話の中で使われる「参照」とはまったく違うものらしいので、困惑しそうだなと。

「参照」ってのは、英語ではなんという単語なんだろう。まさか、アドレスとかポインタとか呼ばれてないだろうな…。

この記事へのツッコミ

Re: 何故、参照なんだろう by 名無しさん    2006/07/07 09:02
参照の原語は reference じゃないでしょうか? カタカナ書きしないのなら、参照以外には訳せないような気がしないでもないですが。
なるほど、reference なのか… by mieki256    2006/07/09 01:13
> 参照の原語は reference じゃないでしょうか?

なるほど、そうなのか、と思って検索してみたら、
下のようなページにたどり着きました。
http://java.sun.com/j2se/1.4/ja/docs/ja/api/javax/naming/Reference.html
http://java.sun.com/j2se/1.4.2/docs/api/javax/naming/Reference.html

たしかに、「アドレス」と「参照」は区別されてるっぽい…
ありがとうございます。勉強になるであります。

#4 [anime] 「マクロス7」と「NANA」は何か関係があるのだろうか

いや、どっちも「7」だから。バンドが出てくる作品に「7」をつけるとヒットするとかそういうジンクスが業界に。嘘。マクロス7ってヒットしたほうなのかな。よくわからん。

そういや、「OO7」という実写映画もあるな。アレも次々とシリーズが作られるぐらいにヒットはしてる、とも言える。ってそれは「バンド」じゃなくて「ボンド」やがな。

以上、1 日分です。

過去ログ表示

Prev - 2006/07 - Next
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project