- PR -

文字列をequalsで判定する時

投稿者投稿内容
あぶぽん
大ベテラン
会議室デビュー日: 2005/10/20
投稿数: 205
投稿日時: 2008-02-18 12:07
引用:

OTAKEさんの書き込み (2008-02-17 12:10) より:
むしろ、str.equals(null)が例外を出すようにしていれば良かったのかも。
そうすれば対称性も保たれるし。



僕はむしろ、「null.equals("Hoge")」という記述が許されるほうに一票を!
(「123.toString()」などと同じくですが)

「"Hoge"がオブジェクトだ!」と声高に言えるぐらいの時代
(リソースなどインフラ面で)が来ているなら、

もう、「Stringだけ特別扱いね」というのはやめて、
「null」だって、「123」だって、オブジェクトとして扱いたいです。

# むろん。「123」とか「null」とか直接コードに書くわけではないですが。。。

当時はそれでも先進的だったのですけど。
(文化が違うのでSmalltalkなら。。っていうのは無しで < 好きですが)

unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2008-02-18 12:31
引用:

あぶぽんさんの書き込み (2008-02-18 12:07) より:
僕はむしろ、「null.equals("Hoge")」という記述が許されるほうに一票を!


Java だと null という状態は、変数が持つものであり、インスタンスが持つものではありませんが、たとえば、↓こういう世界はあっても良いかもしれませんね。
コード:
public class Foo {

    @Override
    public boolean equals(Object obj) {
        if (this == null) {
            /* this == null がありえる世界。 */
            return (obj == null);
        } else {
            return super.equals(obj);
        }
    }
    
    public static void main(String[] args) {
        Foo f0 = null;
        Foo f1 = new Foo();
        /* 呼び元では NullPointerException を出さない。 */
        if (f0.equals(f1)) {
            
        }
    }
}


変数が null だったときの挙動を、メソッドで定義できるというものです。こういう言語だとなにか破綻しますかね?あるいはすでにそういう言語がある?
未記入
大ベテラン
会議室デビュー日: 2008/02/07
投稿数: 115
投稿日時: 2008-02-18 12:49
無駄無駄無駄。

いくらやっても、どうせ、お前ら「真のヌル」を欲しがるだろ。

インスタンスメソッドを書くときに自身が null であるかもしれないという可能性を考慮しないといけないなんて! ありえません。Java を汚さないでください。
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2008-02-18 13:12
nullは型を持たないから
コード:
((String) null).equals("Hoge");


と書かざるを得ないですが、うれしいですか?

私もthisがnullである可能性を考慮しなくてはならないとしたら
それだけで面倒事が増えると考えてしまうなぁ。

衒学的な話題としてはnullのメソッドというのは面白いとは思いますけども。
あぶぽん
大ベテラン
会議室デビュー日: 2005/10/20
投稿数: 205
投稿日時: 2008-02-18 13:21
引用:

nagiseさんの書き込み (2008-02-18 13:12) より:
nullは型を持たないから
コード:
((String) null).equals("Hoge");


と書かざるを得ないですが、うれしいですか?



僕は、

「class Null extends Object」

のイメージで書いたので、

「null.equals("Hoge")」のときの「equals」はNullクラスのメソッドの
つもりでした。

ので、キャストは要らないかと。。。

でも、いろいろ、詳細を突かれたら、そこまで考えてませんから
あぶぽん
大ベテラン
会議室デビュー日: 2005/10/20
投稿数: 205
投稿日時: 2008-02-18 13:32
ちなみに、

コード:
object obj = "Hoge";
if (obj.equals("Hoge")) {
    // なんか
}



こうしたら、どうなります?(自信なし)

コード:
object obj = null;
if (obj.equals("Hoge")) {
    // なんか
}



これもできればいいなという程度のものです。

コード:
object obj = null;
if (obj.equals(null)) {
    // なんか
}



というのもありということになりますね。

いろいろ、問題ありそうですね。。。
細かいことは僕に聞かないで下さい。。。
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2008-02-18 13:58
equalsはObjectに定義されるメソッドですから、
もしもnullがObject型なのだとすればequalsを呼べると考えるかもしれませんが、
nullは単なる無効な参照ですから、その実態によるポリモフィズムはできません。

コード:
Object o = "hoge";
// 変数型としてはObject型だが、変数に格納される実体はStringなので
// Stringでオーバーライドされたequals()が実行される
o.equals("hoge");

// 実体の型なんて分りようがないからObject.equals()しか動かしようがない
null.equals("hoge");



そして、Object.equals()のデフォルトの実装では==による参照比較ですから
コード:
null == "hoge"


と等価ということになる。

変数に格納した場合に、変数の型の該当メソッドを呼べばよいではないか
という意見もあるかもしれませんが

コード:
String str = null;
System.out.println(str.equals("hoge")); // Stringのsqulasが呼ばれる

// 別の変数に代入
Object o = str;
System.out.println(str.equals("hoge")); // Objectのsqulasが呼ばれる


というように、代入によって動きが変わることになる。
もっとも、nullとのequalsなんて結果としての挙動は一緒でしょうから
あまり問題にならないかもしれませんが。

null値がnullオブジェクトパターンとなっていて、
equalsなどのObjectに定義されるメソッド呼び出しぐらいは
行えるという言語仕様のプログラム言語というのはアリかもしれませんね。
あぶぽん
大ベテラン
会議室デビュー日: 2005/10/20
投稿数: 205
投稿日時: 2008-02-18 14:21
引用:

nagiseさんの書き込み (2008-02-18 13:58) より:
コード:
// 別の変数に代入
Object o = str;
System.out.println(str.equals("hoge")); // Objectのsqulasが呼ばれる





それって、本当ですか?

Stringクラスは、Objectクラスのequalsメソッドをオーバーライドしていない
ということですか!?

スキルアップ/キャリアアップ(JOB@IT)