5

「実用的な API 設計」を読んでいて、次の段落を見つけました。

"フィールドよりもメソッドを優先するもう 1 つの理由は、JVM 仕様にあります。メソッドをクラスからそのスーパークラスの 1 つに移動しても、バイナリ互換性を維持することが許可されています。そのため、Dimension javax.swing として最初に導入されたメソッド.JComponent.getPreferredSize(Dimension d) は、JComponent が Component のサブクラスであるため、新しいバージョンでは削除され、Dimension java.awt.Component.getPreferredSize(Dimension d) に移動されます。このような変更は、JDK 1.2 で実際に行われました。これは、フィールドがメソッドによってカプセル化されたためにのみ実行できます. このような操作はフィールドには許可されていません. 一度フィールドがクラスで定義されると、バイナリ互換性を維持するために永遠にそこにとどまる必要があります. これは別の理由です.フィールドを非公開にする

ゲッター/セッターを使用する方が良い方法であることに同意するからです。しかし、パブリック フィールドを親クラスに移動するとバイナリ互換性が失われる理由がわかりません。親でパブリックである限り、子クラスを介してそのフィールドにアクセスできるはずです。

4

2 に答える 2

3

フィールドがクラスで定義されると、バイナリ互換性を維持するために永久にそこにとどまる必要があります

それは非常に驚くべきことです:

Java 言語仕様、Java SE 7 Edition では、非修飾フィールド アクセス式のバイナリ名を次のように定義しています。

クラス C のフィールド アクセスを示す正当な式が与えられ、(おそらく異なる) クラスまたはインターフェイス D で宣言された f という名前の非定数 (§13.4.9) フィールドを参照する場合、フィールド参照の修飾型を次のように定義します。 :

  • 式が Primary.f の形式の場合:
    • Primary のコンパイル時の型が交差型 (§4.9) V1 & ... & Vn である場合、参照の修飾型は V1 です。
    • それ以外の場合は、Primary のコンパイル時の型が参照の修飾型になります。

(Java 1.5 の言語仕様は、まったく同じ表現を使用しています)

つまり、フィールド アクセス式のバイナリ名は、フィールドを宣言する型を参照するのではなく、そのフィールドにアクセスするために使用する一次式の型のみを参照するため、その型のどのスーパークラスがフィールドを宣言しても、コンパイラは同じフィールド参照をクラス ファイルに発行する必要があります。

確かに、私が今から進化しようとしたとき

package p;

public class Super {

}

package p;

public class Sub extends Super {
    public String message;

    @Override
    public String toString() {
        return message;
    }
}

package p;

public class Super {
    public String message;
}

package p;

public class Sub extends Super {
    @Override
    public String toString() {
        return message;
    }
}

再コンパイルせずに

package p;

public class Main {
    public static void main(String[] args) {
        Sub sub = new Sub();
        sub.message = "hello";
        System.out.println(sub);
        System.out.println(sub.message);
    }
}

私はまだの出力を受け取りました

hello
hello

、ではありませんLinkageError

結論として、その主張は Java 7 には当てはまりません。5 年以上前にサポート終了が宣言された JDK 1.4 以前には当てはまった可能性があります。いずれにせよ、より優れた/より新しい本を使用する必要がありますか?

于 2012-04-04T21:34:39.023 に答える
0

私の記憶が正しければ、その本はこれを説明していますが、現在手元にありません。Java 言語とクラス ファイル形式 (Java 以外の言語でも使用される) との微妙な違いについてだったと思います。

少し前後に本をチェックしてください。その部分についてさらに質問があるかどうか尋ねてください。

于 2012-04-04T19:39:04.290 に答える