- - PR -
構文がわかりません
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-10-09 01:53
プリミティブ型のbooleanにはnullが入ることはありません。
もちろんnullとtrue/falseは比較できません。 しかし、booleanのラッパーであるjava.lang.Boolean型の変数が nullになることは当然ありえます。 私も以前は三項演算子を使っていましたが今はほとんど使いません。 「読めない人いるからやめてくれる?」と言われました。 納得しがたい話ではありますが、「これは仕事で書くコード」だと 割り切って、まわりのレベルに合わせるようにしています。 | ||||||||||||
|
投稿日時: 2005-10-10 13:10
余計な話につきあってくださってありがとうございます。
私が嫌う理由は三項演算子だからではありませんよ、さすがに(^_^; 「悪い見本だ」とした理由は「true と false が混じってて気持ち悪い」のと「Boolean 型オブジェクトを使う意味がない」ということからです。
三項演算子はご存じのとおり (条件) ? (条件が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 になってから、明示的にラッパクラスを使うことがなくなってません ? 上記から、実際にどのような処理が省略されているかは知りませんが、私なら
もしくは
としますし、後輩が今回のようなコード書いたらこのように書き換えさせますね。 いかがでしょうか。 | ||||||||||||
|
投稿日時: 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 ] | ||||||||||||
|
投稿日時: 2005-10-11 14:53
こんにちは。 getさんが、三項演算やオブジェクト型(Class, Interface)、プリミティブ型を理解し、会社(プロジェクト)として OKであれば、よいのではないでしょうか。 if 文が一行で書けるというメリットだけです。 プリミティブ型やオブジェクト型が混合していても 言語仕様的には全く問題ありませんので。 そういうヤリ方(テクニック?)もあるという感じで良いと思います。 | ||||||||||||
|
投稿日時: 2005-10-11 15:40
どもです。がると申します。
皆さんが色々書かれているので少々蛇足ではあるのですが。 複雑な式であればあるほど(簡単であっても、ですが)、 きちんと「コメントを書く」ことでしょうか? コメントは「何をしたかったのか」という、思想の根っこ部分 をちゃんと書いておくと後々困らずにすみます。 例えば性能とかの問題で「わかりにくいプログラムにせざるを得ない」 場合、コメント部分に「性能は落ちるけどわかりやすいプログラム」 を書いて「上記のプログラムと等価。性能を上げるために以下の 用に記述」とか書いておくとか。 無論「仕様書にも残す」ものなのですが。念のためにソースコード にも事細かに書いておくと、後々困らずにすみます。 以上、余談でした〜。 | ||||||||||||
|
投稿日時: 2005-10-12 17:53
サンプルのコードは無駄もなく、とてもわかりやすいコードだと思いますよ。 このコードが難しいと思うのであれば、会社のレベルより低いということでしょう。 また、コメントを必要とするコードは悪いコードの可能性があるので気をつけましょう。 (javadocのためのコメントは別) | ||||||||||||
|
投稿日時: 2005-10-12 18:25
こんなのはどうでしょう?
return Boolean.TRUE.equals(debug) debugがnullならfalseになります。 見にくいですかねえ。 | ||||||||||||
|
投稿日時: 2005-10-13 11:07
すばらしい !! 私もこういうものがさくっと出てくるようになりたいものです。 |