読者です 読者をやめる 読者になる 読者になる

技術開発日記

技術やら日々思ったことを綴ってます。

リードオンリー・インタフェース

セキュスペの勉強がてらにIPAのサイトを見ていたら、リードオンリーインタフェース
という考え方があって、なるほどーって思ったりしたので、その内容を少し。

カプセル化のすすめ」と題したその内容は簡単に言うとは普段getterとsetter
を書いているクラスだけじゃ本当に値を変更されたくない変数の更新は防げない。
だから、interfaceを使って制御しよー。
ということらしい。

例えば、以下のようなクラスがあった場合。

public class Member {
    
    public String name;
    
    public String id;
}

以下のように、間違えてどこかで値が変更されてしまう可能性がある。

member.name="another name"

なので、通常はカプセル化という名目で、getterとsetterのメソッドを追加すると思う。
ただ、それだけだと、

member.setName("another name")

みたいに変更される可能性があることに代わりは無く、望まない更新が行われてしまう。

そこで、IPAの方は、getterのみを実装したinterfaceを設定することによって、
setterを制御して、値の変更をさせないようにしようという実装を行うことを進めている。

public interface Member_ReadOnly {
    String getName();
    String getId();
}

public class Member implements Member_ReadOnly {
    
    private String name;
    
    private String id;

    public String getName() {
        return name;
    }
    
    public void setName(String name) {
        this.name = name;
    }
    
    public String getId() {
        return id;
    }
    
    public void setId(String id) {
        this.id = id;
    }
}

こうすることによって

Member_ReadOnly member = new Member()

で生成されたインスタンスはgetterしか定義されていないので、
間違って、「member.setName()」と値が変更できないようになる。(コンパイルエラーになる)

ただ、どちらにせよ「どこかで」値はsetしないといけないわけだから、
使い所としては、重要なオブジェクトや会員情報を更新するときとかの「きわどい処理」とかになってくるとのこと。

参考:3-2. カプセル化のすすめ