Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

呪いのstatic

cuiのRPGゲームを作っていたのですが、セーブ機能を付
ける為にシリアライズを実装した後、上手くセーブのロード
ができず、調べたらstaticな要素はスルーされるというこ
とだったので極力staticを無くそうと画策したのですが

消せば消すほどコンパイルエラーの嵐です。
一度コンパイルを諦めて、ソースコード内の全てのstatic
を消したのですが(main意外)
コンパイラーさん「おどりゃstaticじゃないモンは
staticコンテキストじゃ読み込めないゆーとるやろが」
×49
という状態になってしまいました。(mainをコンパイルしよ
うとした場合)

mainとは全く別のクラスを用意して、そこにmainの処理内
容を移してもコンパイラーさんは怒るばかりです。(つまり
staticを全く含まないクラスでもstaticコンテキストと
して認識されている)

staticコンテキストって、staticと書いてないものの中
にもあるのでしょうか?
例えば、if文は処理的にstaticとして認識されているとい
ったことです。(この喩えがデタラメなのはわかっています

元々、static関係のエラーが出る度に良く考えずなんでも
かんでもstaticを付けたのが間違いだったんですけど、こ
のプログラムを救うことはできないでしょうか
腐海よろしく一度staticにのまれたらもうお終いなのでし
ょうか

解決策、ちょっとした助言、経験談などありましたらよろし
くお願い致します。

3

回答

92519

閲覧

3件の回答

評価

0

staticを外したらnewしないと呼び出せない。
後シリアライズより別の方法のほうがいい気がする。

評価

0

なんで全体をシリアライズしようなんて思ったんだ?

そういう場合は、保存する必要のある情報だけのクラスを作
ってそこにかき集める処理と、書き戻す処理を用意するん
だ。

評価

0

フィールドに保持する情報には、
(1)アプリケーションの状態を表す大元の情報
(2)他の情報から計算できる情報
(3)定数
などがあると思いますが、セーブ・ロードが必要なのは
(1)だけです。故に全てのフィールドではなく(1)を
保持しているフィールドだけを退避回復するのが自然で
す。

設計方針としては大きく2つ考えられると思います。

(A)シリアライズを使う
 (1)に該当する情報は全てインスタンスが保持し、そ
れら全てのインスタンスはトップのインスタンスからたど
れるインスタンス構造になるよう当初から設計すべきで
す。インスタンス上に保持している(2)の情報はシリア
ライズの対象からはずすためにtransientフィールドにし
ます。(3)はstaticフィールドにします。こうすること
によって退避・回復はトップのインスタンスのシリアライ
ズ・デシリアライズにより自然に実現できます。

(B)シリアライズは使わない。
 退避・回復が必要な情報だけを選んで自前で出力・入力
するルーチンを作成します。

退避・回復対象のデータが単純ならば(B)でよいのです
が、データ構造が複雑になってくると自前の入出力処理を
作成するのが非常に面倒になってきます。しっかりしたア
プリケーション設計をしようとするなら(あるいはより洗
練されたアプリケーションにするには)(A)の方式ででき
るようクラス設計するのが良いと思います。

こうしたことを踏まえずに(staticを単に非staticにする
といった方法で)セーブ・ロードを実現しようとするのは
あまりオススメできません。まずはクラス設計をどのよう
にすべきなのかをもっとよく考えてみてはいかがでしょう
か。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。