最近迷っていること: メンバーオブジェクトのアクセサを用意すべきか? #java #プログラミング

最近迷っていること。
クラスのメンバーオブジェクトのアクセサを直接定義するよりは、隠蔽してあげたほうがいいんじゃないかと思うこと。

最終的にケースバイケースだろうとは思いつつ、気にする観点やポリシーなどはまだまだ引き出しが少ない。

直接アクセス可能にする場合

public class Person {
    private Phone phone;
    
    public Phone getPhone(){
        return phone;
    }

    public void setPhone(Phone phone){
        this.phone = phone;
    }
}

隠蔽する場合

public class Person {
    private Phone phone;
    
    public String getPhoneNumber(){
        return phone.getNumber();
    }

    public void setPhoneNumber(String number){
        phone.setNumber(number);
    }
}

なぜ隠蔽するほうがいいと思ったか

理由1

phone はPersonが持ち主にもかかわらず、外部から直接アクセス可能になることによって、 phone のコントロールを外部に渡してしまうことになるから。
(Effective Javaでオブジェクトじゃなくて Date#getTime() を返せっていうような話もあったような)

理由2

PersonクラスのクライアントがPhoneクラスについて依存することになるから。

ありだな、と思った意見

phone フィールドを protected にするのはよさそう。