- PR -

構文がわかりません

投稿者投稿内容
vincent
大ベテラン
会議室デビュー日: 2004/07/09
投稿数: 142
投稿日時: 2005-10-09 01:53
プリミティブ型のbooleanにはnullが入ることはありません。
もちろんnullとtrue/falseは比較できません。
しかし、booleanのラッパーであるjava.lang.Boolean型の変数が
nullになることは当然ありえます。

私も以前は三項演算子を使っていましたが今はほとんど使いません。
「読めない人いるからやめてくれる?」と言われました。
納得しがたい話ではありますが、「これは仕事で書くコード」だと
割り切って、まわりのレベルに合わせるようにしています。
びしばし
大ベテラン
会議室デビュー日: 2002/03/13
投稿数: 181
投稿日時: 2005-10-10 13:10
余計な話につきあってくださってありがとうございます。
私が嫌う理由は三項演算子だからではありませんよ、さすがに(^_^;

「悪い見本だ」とした理由は「true と false が混じってて気持ち悪い」のと「Boolean 型オブジェクトを使う意味がない」ということからです。

コード:
/* 問題のコード */
Boolean debug;
--省略
return debug == null ? false : debug.booleanValue();



三項演算子はご存じのとおり

(条件) ? (条件がtrue時) : (条件がfalse時)

という構文ですが、今回の場合「条件が true 時に、全体が false」ということで「一目読んで(パッと見で)、どういうときにどっちの値が return で帰るのか」がわかりにくくなっています。見づらくするためにわざとこう書いたのではないかと思われるぐらい。

# え、そんなことないですか ?

どうせなら、条件を逆にして

return debug != null ? debug.booleanValue() : false;

のほうがまだわかりやすいと思いますし、この場合は true/false の話なので、架空兎さんが示されたように

return (debug != null) && debug.booleanValue();

としたほうがもっとすっきりします。

# && は左から評価されますから、ここで NullPointerException は出ません。

また「--省略」部でどのように debug(Boolean型オブジェクト)が使われているのかはわかりませんが、プリミティブ型のラッパクラスは immutable ですし、Boolean 型はどうせ Boolean.TRUE か Boolean.FALSE を使うことになります。

# null を含めて「3値型」として使えなくもないですが「もっと悪い使い方」であることはわかっていただけると思います。

「メソッドの最後まで null のままであることがある」「最後まで null なら return false とする」のなら、最初から

Boolean debug = Boolean.FALSE;

と初期値を入れてしまうなりプリミティブ型 boolean を使えばいいと思います。

# JDK5.0 になってから、明示的にラッパクラスを使うことがなくなってません ?


上記から、実際にどのような処理が省略されているかは知りませんが、私なら

コード:
boolean foo( some arguments ){
  boolean debug = false;
--省略
  return debug;
}


もしくは
コード:
boolean foo( some arguments ){
  Boolean debug = Boolean.FALSE; // null にしておかない
--省略
  return debug.booleanValue();
}


としますし、後輩が今回のようなコード書いたらこのように書き換えさせますね。

いかがでしょうか。
get
常連さん
会議室デビュー日: 2003/10/02
投稿数: 21
投稿日時: 2005-10-11 11:09
数々の返信皆さんありがとうございます。
参考に見させていただきました。

私はjavaのコードの書き方を勉強しており、
今回参考書ではなく会社にあるサンプルソースを見ています。

なので省略と書かせて頂いた部分をすべて載せることができないので
一部のみ載せる事にします。

public abstract class test extends TagSupport{

 private Boolean debug;

 protected boolean getDebugEnabled(){

  debug = booleanタイプを返すget****メソッド
  if(debug == null){
   Object obj = pageContext.findAttribute("debug");
   if(obj != null && (obj instanceof Boolean))
    debug = (Boolean)obj;
  }
  return debug == null ? false : debug.booleanValue();
 }
}

タブを認識しなかったので編集

[ メッセージ編集済み 編集者: get 編集日時 2005-10-11 11:11 ]
raystar
ぬし
会議室デビュー日: 2003/01/16
投稿数: 251
お住まい・勤務地: Tokyo/Japan
投稿日時: 2005-10-11 14:53
引用:

私はjavaのコードの書き方を勉強しており、
今回参考書ではなく会社にあるサンプルソースを見ています。



こんにちは。
getさんが、三項演算やオブジェクト型(Class, Interface)、プリミティブ型を理解し、会社(プロジェクト)として
OKであれば、よいのではないでしょうか。

if 文が一行で書けるというメリットだけです。

プリミティブ型やオブジェクト型が混合していても
言語仕様的には全く問題ありませんので。

そういうヤリ方(テクニック?)もあるという感じで良いと思います。
がるがる
ぬし
会議室デビュー日: 2002/04/12
投稿数: 873
投稿日時: 2005-10-11 15:40
どもです。がると申します。
皆さんが色々書かれているので少々蛇足ではあるのですが。
複雑な式であればあるほど(簡単であっても、ですが)、
きちんと「コメントを書く」ことでしょうか?

コメントは「何をしたかったのか」という、思想の根っこ部分
をちゃんと書いておくと後々困らずにすみます。

例えば性能とかの問題で「わかりにくいプログラムにせざるを得ない」
場合、コメント部分に「性能は落ちるけどわかりやすいプログラム」
を書いて「上記のプログラムと等価。性能を上げるために以下の
用に記述」とか書いておくとか。

無論「仕様書にも残す」ものなのですが。念のためにソースコード
にも事細かに書いておくと、後々困らずにすみます。

以上、余談でした〜。
Kensaku
常連さん
会議室デビュー日: 2003/02/16
投稿数: 22
投稿日時: 2005-10-12 17:53
引用:

getさんの書き込み (2005-10-11 11:09) より:
数々の返信皆さんありがとうございます。
参考に見させていただきました。

私はjavaのコードの書き方を勉強しており、
今回参考書ではなく会社にあるサンプルソースを見ています。

なので省略と書かせて頂いた部分をすべて載せることができないので
一部のみ載せる事にします。

public abstract class test extends TagSupport{

 private Boolean debug;

 protected boolean getDebugEnabled(){

  debug = booleanタイプを返すget****メソッド
  if(debug == null){
   Object obj = pageContext.findAttribute("debug");
   if(obj != null && (obj instanceof Boolean))
    debug = (Boolean)obj;
  }
  return debug == null ? false : debug.booleanValue();
 }
}


サンプルのコードは無駄もなく、とてもわかりやすいコードだと思いますよ。
このコードが難しいと思うのであれば、会社のレベルより低いということでしょう。
また、コメントを必要とするコードは悪いコードの可能性があるので気をつけましょう。
(javadocのためのコメントは別)
つんけん
会議室デビュー日: 2003/12/18
投稿数: 5
お住まい・勤務地: 京都
投稿日時: 2005-10-12 18:25
こんなのはどうでしょう?
return Boolean.TRUE.equals(debug)

debugがnullならfalseになります。
見にくいですかねえ。
びしばし
大ベテラン
会議室デビュー日: 2002/03/13
投稿数: 181
投稿日時: 2005-10-13 11:07
引用:

つんけんさんの書き込み (2005-10-12 18:25) より:
return Boolean.TRUE.equals(debug)



すばらしい !!

私もこういうものがさくっと出てくるようになりたいものです。

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