【初心者必見】データ隠ぺいの効果をJavaの標準APIを例に解説

データ隠ぺいすることのメリットは何?

そう思った方は以下の記事を読んでください。

Javaの標準APIにその範を求めましょう。なお、新人エンジニア研修でこの hashCode()メソッド の仕組みを理解することは求めませんのでリラックスして聞いてください。

StringクラスのhashCode()メソッドを使ってこんなことができます。

package chap11;

public class Example01 {

    public static void main(String[] args) {
        System.out.println("A".hashCode());
        System.out.println("AA".hashCode());
    }
}

<実行結果>

65
2080

“65”は文字Aの文字コードを10進表記したものです。では、“2080”はどこから来たのでしょうか?

IDEを使ってこのStringクラスのhashCode()メソッドの定義をさかのぼりましょう。以下のコードにあるhashはStringクラスの172行目に以下のようにあります。

 /** Cache the hash code for the string */
    private int hash; // Default to 0
Java17標準API
 

デフォルトは0ですね。

また、valueは以下156行目の通りStringのインスタンスを格納するchar型の配列です。どちらも"private"で宣言されていることが今回のテーマである情報隠蔽と関連していますので心に留めてください。

 /** The value is used for character storage. */
    private final char value[];
Java17標準API
   

このあともStringクラスのソースを辿ると“2080”の謎は明らかになります。余裕のある研修会場では講師と一緒に追求してみてください。

ここで本題のカプセル化に戻ります。

hashは172行目で以下のように"private"で宣言されていましたね。(再掲)

  /** Cache the hash code for the string */
    private int hash; // Default to 0
Java17標準API

つまり、非公開ということで、「このクラスからのみアクセスできるフィールドである」という宣言です。他クラスからのアクセスを拒否するという意味です。ですから、以下のようなことはできません。

package chap11;

public class Example02 {

    public static void main(String[] args) {
        "A".hash = 1;
    }
}

上記のプログラムにはエラーが出ているはずです。

強引に実行すれば、

<実行結果>

Exception in thread "main" java.lang.Error: Unresolved compilation problem:
フィールド String.hash は不可視です

と出力されます。

ハッシュ値の性質からそれを強引に書き換えられたとしたらセキュリティ問題や整合性の問題が発生することは容易に想像できるのではないでしょうか?

つまり、このようにフィールドの値を更新するときには必ずメソッドを使って更新し、フィールドには直接アクセスできなくすること」がデータ隠蔽です。公開すべきものと非公開にすべきものを明確に分け、公開したものだけを使ってプログラミングをするようにプログラマに促しているのです。

セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク

投稿者プロフィール

山崎講師
山崎講師代表取締役
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。