- - PR -
staticメソッドに関して
| 投稿者 | 投稿内容 | ||||
|---|---|---|---|---|---|
|
投稿日時: 2002-07-31 08:21
初めまして。JAVAでWEBの開発を行っています酒井と申します。
staticに関して前からの疑問を教えてください。 下記のような入力項目のチェッククラスを作成して チェックメソッドはstaticにしようと考えています。 この時にAオブジェクトとBオブジェクトが このメソッドを使った場合、 Aはchecker.isIndispensable("right"); Bはchecker.isIndispensable(""); なので当然Aはtrue、Bはfalse となるべきですが、なにかの原因でAの渡したパラメータが Bの渡したパラメータに置き換えられてBがエラーになったりすることが あるのでしょうか? 教えてください。 public class Checker { /** * 入力データが存在するかどうかをチェックする。 * オールスペース、空文字、NULLは不可 */ public static boolean isIndispensable(String param) { if (param == null || param.trim().equals("")) { return false; } else { return true; } } } | ||||
|
投稿日時: 2002-07-31 09:10
> Aはchecker.isIndispensable("right");
> Bはchecker.isIndispensable(""); は Checker.isIndispensable("right") と Checker.isIndispensable("") ですよね。(揚げ足取りでごめんなさい) このstaticメソッドにおいては問題はないはずです。Integer.parseInt()メソッドとかででそんなことは起きたら困ります。ただ、メソッド内部でフィールド変数などに書き込んだりする場合には排泄処理をしないと結果が変わってしまうこともありえます。 | ||||
|
投稿日時: 2002-07-31 09:14
起こりえません。
#何故そう思ったのかを書いた方が疑問が解けるかもしれませんよ。 ついでに、staticメソッドなのですから"Checker.isIndispensable("hoge");"と書いた方が問題が起きにくいと思います。 | ||||
|
投稿日時: 2002-07-31 11:14
staticメソッド云々の問題ではないですね。
ではなく if (param == null || param.equals("") || (!param.equals("") && param.trim().equals(""))) { とすべき。 APIリファレンスをみると、Stringクラスのtrimメソッドは"空文字をtrimした場合、 空文字の入っている文字列オブジェクトへの参照を返す"仕様になっています。 APIリファレンスをきちんとみましょう! APIリファレンスをみる癖をつけたほうがいいですよ。 [ メッセージ編集済み 編集者: asip 編集日時 2002-07-31 11:22 ] | ||||
|
投稿日時: 2002-07-31 13:18
どうも
asipさんの、お書きになった説明の意味が解らないです。 要するに param.trim().equals("") で良いのではないんでしょうか? (喧嘩を売っているのではなく、純粋にです。) | ||||
|
投稿日時: 2002-07-31 14:54
Javaの条件式はC/C++同様、左から順に評価していき、ORでつないである場合は結果がtrueになったらその先は評価しません。なので、
param.equals("") || (!param.equals("") && param.trim().equals("")) この場合の !param.equals("") は、明らかに冗長です。 [ メッセージ編集済み 編集者: へげもん 編集日時 2002-08-01 11:46 ] | ||||
|
投稿日時: 2002-07-31 15:07
Stringは文字列リテラル(")で囲まれた文字列の場合、
同じ文字列に対して常に同じオブジェクトの参照を返します。 つまり、"abc"というStringオブジェクトがあった場合、 それが文字列リテラルで囲まれてプログラム中に記述されている場合は プログラム中のどこに書かれている"abc"も 同じ一つのStringオブジェクトへの参照を持つ結果になります。 ただし、これはあくまで文字列リテラルで囲まれている文字列の場合であって プログラム処理中に生成されるStringオブジェクトに関してはそうであるとは限りません。 そして、Stringのtrim()はtrimをかけた両端のコードが'\u0020'より大きければ、 つまり半角スペースやその他制御文字が両端に存在しなければ trimを適用したStringオブジェクトそのものへの参照を返しますが、 そうでない場合は新しいStringオブジェクトを生成してそれへの参照を返します。 ので、trim()を用いるとそれまで扱っていたオブジェクトと trim後のオブジェクトが違う場合があるのです。 ポインタが変わってしまうわけですね。 なので、そこに注意をしたほうがいいですよという風に私は受け取ったのですが・・・。 ただ、Stringに関して言うなら==で比較していたら参照が変わると 中身が同じでもfalseが返りますが、 equalsの場合は参照でなく中身を比較するので 結局param.trim().equals("") でいいんじゃないかと思います。 この辺り私も理解が曖昧なのですが。 まぁ、そういうわずらわしいことを考えたくないならいっそのこと param.trim().length() == 0ってやっちゃうのも手かなと。 [ メッセージ編集済み 編集者: ayum 編集日時 2002-07-31 15:21 ] | ||||
|
投稿日時: 2002-07-31 17:10
へけもんさん、ご指摘ありがとうございます。
は確かに冗長でした。 if (param == null || param.equals("") || param.trim().equals(""))) { のほうがいいですね。 | ||||
