- PR -

staticメソッドに関して

投稿者投稿内容
ゆう
常連さん
会議室デビュー日: 2001/12/10
投稿数: 33
投稿日時: 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;
}
}
}
H2
ぬし
会議室デビュー日: 2001/09/06
投稿数: 586
お住まい・勤務地: 港
投稿日時: 2002-07-31 09:10
> Aはchecker.isIndispensable("right");
> Bはchecker.isIndispensable("");
は Checker.isIndispensable("right") と Checker.isIndispensable("") ですよね。(揚げ足取りでごめんなさい)

このstaticメソッドにおいては問題はないはずです。Integer.parseInt()メソッドとかででそんなことは起きたら困ります。ただ、メソッド内部でフィールド変数などに書き込んだりする場合には排泄処理をしないと結果が変わってしまうこともありえます。
英-Ran
ベテラン
会議室デビュー日: 2002/06/12
投稿数: 55
投稿日時: 2002-07-31 09:14
起こりえません。

#何故そう思ったのかを書いた方が疑問が解けるかもしれませんよ。

ついでに、staticメソッドなのですから"Checker.isIndispensable("hoge");"と書いた方が問題が起きにくいと思います。
asip
ベテラン
会議室デビュー日: 2001/12/27
投稿数: 77
投稿日時: 2002-07-31 11:14
staticメソッド云々の問題ではないですね。

引用:

if (param == null || param.trim().equals("")) {



ではなく

if (param == null || param.equals("") || (!param.equals("") && param.trim().equals(""))) {

とすべき。

APIリファレンスをみると、Stringクラスのtrimメソッドは"空文字をtrimした場合、
空文字の入っている文字列オブジェクトへの参照を返す"仕様になっています。

APIリファレンスをきちんとみましょう!

APIリファレンスをみる癖をつけたほうがいいですよ。

[ メッセージ編集済み 編集者: asip 編集日時 2002-07-31 11:22 ]
moken
会議室デビュー日: 2002/07/22
投稿数: 6
お住まい・勤務地: 東京都三鷹市
投稿日時: 2002-07-31 13:18
どうも
asipさんの、お書きになった説明の意味が解らないです。
要するに param.trim().equals("") で良いのではないんでしょうか?
(喧嘩を売っているのではなく、純粋にです。)
へげもん
ベテラン
会議室デビュー日: 2002/04/14
投稿数: 87
お住まい・勤務地: 埼玉県
投稿日時: 2002-07-31 14:54
Javaの条件式はC/C++同様、左から順に評価していき、ORでつないである場合は結果がtrueになったらその先は評価しません。なので、
param.equals("") || (!param.equals("") && param.trim().equals(""))
この場合の !param.equals("") は、明らかに冗長です。


[ メッセージ編集済み 編集者: へげもん 編集日時 2002-08-01 11:46 ]
ayum
常連さん
会議室デビュー日: 2002/03/28
投稿数: 44
お住まい・勤務地: 東京
投稿日時: 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 ]
asip
ベテラン
会議室デビュー日: 2001/12/27
投稿数: 77
投稿日時: 2002-07-31 17:10
へけもんさん、ご指摘ありがとうございます。
引用:

if (param == null || param.equals("") || (!param.equals("") && param.trim().equals(""))) {


は確かに冗長でした。

if (param == null || param.equals("") || param.trim().equals(""))) {

のほうがいいですね。

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