2011-07-28 4 views
4

java.awt.font.TextLayoutの公式OpenJDK sourceから、このコードを考えてみましょう:Javaの最終クラスの保護されたメソッドの使用例は何ですか?

public final class TextLayout { 

    /* ... */ 

    protected void handleJustify(float justificationWidth) { 
     // never called 
    } 
} 

ここではユースケースは何を、なぜそれが一般的にそのようなコードを書くことが意味をなすのでしょうか?

+6

この特定の方法は*完全に役に立たないようです。 –

答えて

4

protectedメンバーには同じパッケージのコードでアクセスできます。私の推測では、以前の(おそらく公開されていない)バージョンでは非最終的だったクラスが最終的に作成され、保護されたメソッドはそれを使用する同じパッケージにコードが存在する可能性があるため保持されます単にプライベートなパッケージに変更したのは、誰もそのメリットを見なかったからです)。

が保護のみ独自のパッケージに使用されるように

+0

その場合、プライベートパッケージはより明確になりました。 – orbfish

+0

@Michael、保護されたメソッドの存在は、TextLayoutがサブクラス化されることを実際に意図していたことを示唆していますか? – Pacerier

+0

@Pacerier:はい、保護されたものを使用する唯一の理由です。 –

1

クラスをさらに拡張またはサブクラス化することはできませんが、このメソッドはパッケージ内から引き続きアクセスできます。保護された

5

は(access levelsを参照)である。

  • にかかわらず、パッケージの、クラスを拡張するために。
  • 現在のパッケージのすべてのクラスがアクセスできます。

finalクラスの場合、このメソッドは同じパッケージ内の他のクラスで使用されます。アクセス修飾子なし(「パッケージプライベート」とも呼ばれます)と同じです。

+2

package-privateを使用してみませんか? – Bozho

+0

@Bozho:おそらく歴史的な理由のため –

+0

しかし、ユースケース2では、可視性修飾子なしでメソッドを定義することは可能です。最終的なクラスで保護されたメソッドを持つことはあまり意味がないことは事実かもしれません。 – Giorgio

3

- メンバー - だけでそのパッケージ内のバリアとそのサブクラス

誰かがfinalとしてメソッドを定義している場合、それがオーバーライドすることはできませんすることはできませんし、動的に見上げ。ここ

参考:http://www.javacamp.org/javaI/Modifier.html

0

それはそこにちょうどので:これは別のものを拡張したクラスだった場合、保護されたメソッドは、スーパークラスで保護された方法を拡張することがあります。探すべきもう一つの理由。

関連する問題