2016-05-02 6 views
-1

今日はいくつかのコードを調べました。誰も外からSomeHandlerにアクセスすることはできないはずですので、私たちはそれfinal作るべき理由を見ることができない私たちはプライベートなインナークラスを最終的に作るメリットは何ですか?

public class SomeClass 
{ 
    ... 
    final private class SomeHandler implements Blahblah 
    { 
     ... 
    } 
} 

:そして、私はこのような何かを発見しました。誰か別の洞察力を持っていますか?

+2

なぜそれが最終的であるべきか、それともプライベートであるべきかを尋ねていますか? – CubeJockey

+0

ベストケース: 'SomeHandler'クラスを拡張するクラスがないことを作者が明確にしたかったので、最終的です。 – DwB

+0

@CubeJockey私は「なぜそれが最終的であるべきか」と尋ねています。 – shinkou

答えて

2

クラスをfinalと宣言することは、2つの関連するが別個の目的を有する。

  1. コンパイラに「このクラスを拡張できないように」指示します。これは主に間違いを防ぐために行われます。

  2. これは読者に「このクラスが拡張されるかもしれないことを心配しないでください」と伝えます。これは理解を助けるためです。

private final内部クラスの場合、私たちは、一人の書き込みやクラスを変更することを想定することができ、彼らは設計を理解した後にそれを行うこと。したがって、(設計によって)拡張すべきではないクラスを誤って拡張する可能性は小さい。

しかし、private内部クラスが知っている必要があるコードを読んでいる人は、クラスが宣言されていない限り、Javaソースファイル全体をスキャンする必要がありますfinal

したがって、finalは、設計の可読性を向上させるためのマニフェストの作成に役立ちます。一方


、あなたがを発見した例ではfinal、特定の意図なしに追加されている可能性があり、すなわち、単に「冗長」とすることができる。

+0

+1サブクラス化による拡張のために意図的に設計されている場合を除いて、*よく設計された* Javaクラスはほとんど常に「final」にする必要があります。 Java言語のクラスがデフォルトで最終的なものではないという事実は、80/90の考え方から、クラス継承の頻繁な使用が良い考えであるという、言語設計ミスでした。 "Effective Java"、 "Practical API Design"、 "API Design for C++"などの現代的な作品は、デフォルトでクラスを「最終的」にし、一般的な「仮想」メソッドを避けるために推奨されています。 –

+0

実際に、内部クラスが巨大クラスで宣言されている場合、 'final'キーワードを追加すると、コード内のものを検索する際に多くの助けになります。私は前に、良い点を考えていない! :) – shinkou

+0

@Rogério面白いです。しかし、私はバグだったいくつかのサードパーティのライブラリ(オープンソース)のクラスのメソッドの1つをオーバーライドできたらと思いました。私はクラス全体をコピーして終了し、それを自分のコードで修正しました。 _well-designed_だけでは不十分です、IMO。 – shinkou

関連する問題