- PR -

特集「私がJavaからC#に乗り換えた10の理由」について

投稿者投稿内容
yamasa
ベテラン
会議室デビュー日: 2003/02/15
投稿数: 80
投稿日時: 2003-07-27 21:12
引用:

英-Ranさんの書き込み (2003-07-24 09:05) より:
具体的には、どのようなfinalizeメソッドが問題となるのでしょうか。
finalizeがいつ呼び出されるかはわからないので、
そんなfinalizeを作ることの方に問題があるような気がするのですが。


確かにJava言語仕様はfinalizeが呼び出されるタイミングについて
ある程度VMの実装に委ねていますが、
オブジェクトが強到達可能である間にfinalizeメソッドを呼ぶことは認めていません。

言語仕様に従えば、inner class のインスタンスへの参照を持っている限り、
enclosing instanceへは(直接の参照を持っていなくても)強到達可能なはずです。
それなのに、enclosing instanceのfinalizeメソッドが呼ばれてしまうのは
問題ですよね。

# ここで問題にしているのは「Java言語仕様で定められた通りの挙動を
# 示すかどうか」です。finalizeメソッドの中にどのような処理を記述しているのか
# については一切関知しません。単に、
# System.out.println();
# とだけ書かれたfinalizeメソッドでも、挙動が変わることに違いはありません。
引用:

引用:

いや、それ以前の問題で、最適化を行なうVMと行なわないVMそれぞれで
シリアライズした結果のバイト列が異なってしまいますよね。


バイト列が異なることによってどのような問題が起こるのでしょうか。
コンパイル時点で同一のバイトコードが生成されることはJava言語仕様で
規定されていない(例えば、未使用の変数を削除するかどうか、
private変数の変数名を変換するか否か)ので、
これも特に問題ではないような気がします。


シリアライズでは、そんな単純な話にはなりません。
たとえprivateと宣言されている変数でも、勝手に削除すると
互換性に影響することがあります。
http://java.sun.com/j2se/1.4/ja/docs/ja/guide/serialization/spec/version.doc7.html
引用:

# 言語仕様でできないと書いてあるからできないんだというのは了解してますが
# 問題点を理解しておきたいので。
# しつこく感じたら、申し訳ない


いえ、別に構いませんよ。
ただ、ちょっとスレ違いの話題になってるかも…
英-Ran
ベテラン
会議室デビュー日: 2002/06/12
投稿数: 55
投稿日時: 2003-07-29 23:32
引用:

yamasaさんの書き込み (2003-07-27 21:12) より:
言語仕様に従えば、inner class のインスタンスへの参照を持っている限り、
enclosing instanceへは(直接の参照を持っていなくても)強到達可能なはずです。
それなのに、enclosing instanceのfinalizeメソッドが呼ばれてしまうのは
問題ですよね。



確かに、それだとJava言語仕様に反しますね(でも、実害が思いつかないなあ。互換性確保の安全策をとったと考えるべきか……)。

引用:

シリアライズでは、そんな単純な話にはなりません。
たとえprivateと宣言されている変数でも、勝手に削除すると
互換性に影響することがあります。
http://java.sun.com/j2se/1.4/ja/docs/ja/guide/serialization/spec/version.doc7.html



結構クワッとくる仕様ですね。Serializationと聞くとどうしても「永続化」というイメージがあるのだけれど、あくまで一時的なデータのやり取り用ということでしょうかね。

引用:

いえ、別に構いませんよ。
ただ、ちょっとスレ違いの話題になってるかも…



詳しい説明ありがとうございました。非常にためになります。

# 確かに元の記事からずいぶんずれてしまいましたね。
# このスレッドも終焉を迎えたようですので、ご勘弁を

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