- PR -

Javaの稀な記述法

投稿者投稿内容
カブトムシ子太郎
会議室デビュー日: 2006/04/12
投稿数: 16
お住まい・勤務地: 横浜
投稿日時: 2007-10-17 23:31
JAVAで時々、見かける記述法でどんな処理をしているか調べづらく
なかなかみつからないので知ってる方は教えてください。

以下がコードの一部で処理の意味がわからないところが■の部分です。

■の部分はif分の変化形なのでしょうか?
if(user != null){
loggedIn = user;
}
って意味ですか?
でもuserは独自で定義した型なので,Boolean型のloggedInには格納できませんよね?
私が見慣れないだけで、基本的な記述かもしれませんが、教えてください。
あと、こういう記述方法で困ったときってどのように検索してますか?
いいサイトとかあれば教えていただきたいです。
---------------------------------------------------------------
try {
    boolean loggedIn = false;
// isSecurelyLoggedIn();
role = getRoleFromPage();
USER user = null;
// if (role != Data.ROLE_USER) {

OutDb out = new OutDb(logic.getDataSource());
String email = out.getDb(USER.I_USER_EMAIL, "");

if (logic.isLdapUser(email)) {
user = doLoginLdap(email);
loggedIn = user != null;
if (!loggedIn) {
addError("LDAP authentication failed");
} else {
user = logic.login(role, true);
■loggedIn = user != null;
if (!loggedIn) {
addError("Could not log in with these credentials");
}
}
---------------------------------------------------------------
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2007-10-17 23:42
表記としては見にくいっちゃ見にくいですね。
loggedIn = user != null;
すなわち
loggedIn = (user != null);
でしょうね。
(user != null)
は何を返すでしょか。userがnullならfalseを、nullでなければtrueを返しますね。
ということで、userがnullならloggedInにfalseを、nullでなければtrueを格納するんでしょうね。
loggedIn という変数名(と型)から考えても「ログインしているかどうか」をあらわすんでしょう。

if(user != null){
loggedIn = user;
}
ではないですね。
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2007-10-17 23:59
べる氏の回答の通りなのですが、ポイントは演算子の優先順位。
例えば、算数の場合は+より×を先に計算しますよね?

Javaの演算子の場合は以下のページなどで解説されています。
http://www.javaroad.jp/java_operator7.htm

括弧をつけない場合、代入の"="は優先順位が低い。
だから、比較演算子の"!="が先に計算されるわけです。
その結果が"="で代入されるというわけ。
順位が一緒なら左から順に演算されます。
GENZO
大ベテラン
会議室デビュー日: 2003/11/26
投稿数: 111
お住まい・勤務地: 名古屋
投稿日時: 2007-10-18 00:20
指定の箇所では、user != nullの結果をloggedInに代入しています。

if (user != null){
loggedIn = true;
}else{
loggedIn = false;
}

と等価な意味になります。
カブトムシ子太郎
会議室デビュー日: 2006/04/12
投稿数: 16
お住まい・勤務地: 横浜
投稿日時: 2007-10-18 03:45
みなさんご協力ありがとうございました。

ソースを書くときは、少しは一般的な書き方をこころがけて
ほしいですね。可読性も増しますし・・・。

よく、一行にまとめようとして一見わかりにくい記述をされると
困惑してしまうことがしばしばあります。
ベテランの方にそのような傾向があるような気がしますが・・・。

私個人の意見としては、初級のプログラマーでもわかりやすく、
一般的に書くほうがいいと思うのですが・・・。

それと同時に自分のキャパも増やさなければいけないのはもちろんですが・・・。
Ray
ベテラン
会議室デビュー日: 2007/09/13
投稿数: 88
投稿日時: 2007-10-18 04:31
boolean isEmpty(){
return null == user;
}

a.returnに式を直接書くことをよくします。
b.nullなどの書き換えられないものを、必ず比較演算子の左に書きます。
希でしょうか。わかりにくいでしょうか。
Kazuki
ぬし
会議室デビュー日: 2004/10/13
投稿数: 298
投稿日時: 2007-10-18 06:43
別に特殊な文法は使ってないと思います…
ただ、こういうのは普通
コード:
user = logic.login(role, true); 
■loggedIn = user != null; 
if (!loggedIn) { 
  addError("Could not log in with these credentials"); 
} 


私は、変数とかにいれずにifの中にuser != nullを直接書きます。
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2007-10-18 08:55
私だったらですが...

(1) loggedIn = user != null; を使うことは、いとわない。if を使うほうが複雑になるという考えもできるから。演算子の種類にもよると思います。3項演算子だと悩むところですが。
(2) 自分で書く場合は優先順位を良く覚えていないので loggedIn = (user != null); と括弧を書く。人が括弧を書かくても、優先順位を良く知っている人なのだと思い、それは気にしない。
(3) null == user; とはしない。昔の C とは違い、コンパイラーが警告してくれるし、また、どうせ foo == user; と foo = user; を間違えればどうしようもないので null などの時だけを特別扱いにしてもしかたがないと思うから。
(4) 一時変数に入れるのは、代入と比較を切り分けることが出来るメリットがある反面、ソースコードを初めて読む人は変数の寿命を気にしないといけなくなる。すなわち、一時変数なのか、何行も後ろのほうでも使われる変数なのかがぱっと見で分からないので、そういう意味ではなまじ一時変数に入れると見づらくなる。

(ひとそれぞれにいろいろポリシーはあると思います。unibon はこういう人なんだな、という紹介だけです。)

--
unibon {B73D0144-CD2A-11DA-8E06-0050DA15BC86}

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