って、これダメじゃね?

先のエントリーの続き。

マップがこのキーのマッピングを保持していない場合は null を返します。

http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/api/java/util/Map.html#get(java.lang.Object)

これは、java.util.Map インターフェイスの仕様な訳です。すなわち、このインターフェイスを実装したクラスは、Map型で受け取れるんですよね。

つまり、Mapの仕様を満たしていなければ問題があるのではないか、と気づいた。上のエントリーの様な、ちょっと弄った実装(fooの無名クラスによる実装)であっても、Map型の変数である限り、開発者はMapの仕様を元にコーディングする訳ですよね。

例えば、上のエントリーのようにfooが定義された(できた)として、Barクラスはこんなコードだったとします。

public class Bar {
  public static void baz(Map<String, String> quux) {
    ...
  }
}

そして、他人がBarクラス「だけ」を読んで修正を試みたとします。その時は、その他人は「quuxはMapだから、(MapのJavadocを読むに)対応する値が存在しない場合はnullを返すはずである」と判断するでしょう。

これって、ダメな事ですよね。一般的に何て言うんだろ、こういうの。仕様違反? なんか「カプセル化に違反」とかそのくらいメジャーな言葉があっても良い気がする。これもカプセル化違反の一種かなぁ。

でも、これって「ダメ」ってあんまり認識されてない気がするんですが、現実どうなんでしょうね。俺が知らないだけ?

追記

まぁ上記の対策としては「そんなクラスは作らんで、ちゃんとnullの時の処理を書く」という事になる。ただ、大した負荷にはならない時は良いけども、「仕様違反しないとつらいぜー」って時もあるでしょう。

このケースのように他人を陥れる事なく、「シグネチャは既存のものと同じだけど、仕様(Javadoc)の違うインターフェイス」を使用するには、どうすればいいんだろう。「MyMap」っていう新しいインターフェイスJavadocだけが違って、Javaのコードとしては同一のもの)を作る? それもDRYに反してる。