堅牢性を獲得する章

2.3. メソッドの可視性

『目的』

メソッドの可視性に注意を払ってクラス同士の結合を小さくしましょう。

『Before』

メソッドには、public、protected、private、package-private の4種類の可視性があります。

可視性を考慮していないクラスです。

public class Hoge {

    /* Hoge内部でしか利用しないメソッド */
    public void method1() {
        :
    }
    /* Hogeのサブクラスしか利用しないメソッド */
    public void method2() {
        :
    }
    /* 同一パッケージ内でしか利用しないメソッド */
    public void method3() {
        :
    }
    /* どこからも使われるメソッド */
    public void method4() {
        :
    }
}

実装の詳細をさらけ出すことは好ましくありません。

『After』

適切な可視性を適用しましょう。
情報隠蔽またはカプセル化といいます。

public class Hoge {

    /* Hoge内部でしか利用しないメソッド */
    private void method1() {
        :
    }
    /* Hogeのサブクラスしか利用しないメソッド */
    protected void method2() {
        :
    }
    /* 同一パッケージ内でしか利用しないメソッド */
    void method3() {
        :
    }
    /* どこからも使われるメソッド */
    public void method4() {
        :
    }
}

まずは、外部に公開すべきメソッドはpublicとしましょう。
そして、他のメソッドはとりあえずprivateとしましょう。
次に、同一パッケージの他のクラスから使われるメソッドであればpackage-privateとしましょう。
そして、サブクラスから使われるメソッドはprotectedとしましょう。

実装上、どうしても可視性を狭められないのであればコメントにその旨を記載しましょう。

これはJComboBoxクラスです。

public class JComboBox extends JComponent 
    implements ItemSelectable,ListDataListener,ActionListener, Accessible {
    :
    /**
     * この protected メソッドは実装固有のものです。直接のアクセスやオーバーライ
     * ドはしないでください。
     */
    protected void selectedItemChanged() {
        :
    }
    :
}

『まとめ』

クラス同士の結合を弱めるためにメソッドの可視性を設定するときはできる限り制限を強くしましょう。 publicにする必要がなければprotected、protectedにする必要がなければprivateとしましょう。

結合を弱めると以下のようなメリットがあります。

「開発」
並行開発が可能になります。開発スピードが上がります。

「テスト」
他のモジュールの影響を心配する必要がなくなります。デバッグ・修正がしやすくなります。

「理解」
内容を理解しやすくなります。

「再利用」
他のモジュールに依存がなければ再利用が容易になります。

「最適化」
どのモジュールが問題を起こしているのかがわかりやすいので他のモジュールに影響を与えることなく最適化ができます。

< 前のページへ

Pagetop