スッキリわかるJava入門

CodeZineさんの記事で『スッキリわかるJava入門』を採点してみました

復活しました

いつも拙著『スッキリわかるJava入門』『スッキリわかるJava入門 実践編』にあたたかい書評をいただきありがとうございます。先日はamazonさんのコメントで身に余る評価をいただき、西東京にむかって手を拝んでしまいました。ここひとつきほど、いろいろとプライベートの事情でお仕事など身動きとりにくくなっていたのですが、やっと通常運転に戻ってきたところです。

そういえば一周年。

『スッキリわかるJava入門』の発売日が2011年10月14日ですので、思えば発売から1年が過ぎました。
本屋さんにいくと、それぞれ魅力的な切り口のJava入門書があるなぁといつも思いますが、1年たった今も拙著がamazonランキングの上位にまぜていただけてること、大変光栄です。

sjava
sjavap

そしてつい最近、CodeZineさんに「Java入門ブックガイド(入門編) よりよき入門書と出会うために」という記事があることを思い出しました。よく書店でご覧になるさまざまなJava入門書について、技術的項目に言及があるか(カバーしているか)という観点で比較してあります。

評価の軸が「わかりやすいか」ではないので、拙著の一番のウリは評価外となってしまうのですが、「イラストの雰囲気が柔らかいけど、中身も薄いんじゃない?」と心配な方がいたらいけないので1「あんな分厚い図体してて、そんなこと思うかよ。」はい、重くてごめんなさい…、自己採点しておきます。

実務に耐えうる準備をするための項目比較

対象:『スッキリわかるJava入門』 初版

評価項目 評価 ページ(備考)
プログラムのコンパイルの仕方、実行の仕方 ○ 208
mainメソッドの意味 ○ 170, 172
識別子 ○ 41
演算子と優先順位 ○ 66
変数 ○ 40
文字と文字列の違い ○ 46
基本型と参照型の違い ○ 149
java.util.Scanner ○ 86
式 ○ 62
if文の詳細な構文 ○ 101
短絡評価 × –
後置増分(減分)演算子と前置増分(減分)演算子 ○ 69
break文とcontinue文(ラベル付きを含む) △ 125(ラベル付き解説を含まない)
printfメソッド ○ 44(実践編)
基本型の縮小変換、拡大変換 ○ 72
エスケープ・シーケンス(拡張表記) ○ 59
配列の初期化と代入 ○ 138
拡張for文 ○ 147
配列のコピー(配列変数の代入との違い) △ 149(参照コピーの例で解説)
ガベージコレクション ○ 154
finalizeメソッド ○ 241(実践編)
仮引数と実引数の区別 ○ 178
enum ○ 105(実践編)
マジックナンバーの定数化 ○ 467(実践編)
数の表記法 ○ 59
予約語 ○ 42

おお〜…ちょっとグレーな採点もありますが、思ったよりは○がついた印象です。
ごらんの通り、他の入門書と比較して遜色ない程度に技術的事項も網羅してありますから安心してください^^

論理演算子の短絡評価

ただ残念ながら×がついてしまったのが「短絡評価」です。んー、これは解説してなかったなぁ…。
実務に備えるための入門者が100%知っておくべきほどではないかな2むしろ実践編で紹介したツールや開発方法論のほうがよっぽど必須のような…と思いますが、せっかくなのでブログで補足いたしますね!

短絡評価とは

短絡評価とは、「論理演算子などを使った条件式をif文などで使った場合、JVMがちょっと賢い動作をする」というお話です。

int i = 10; int j = 100;
if(i == 10 || j == 50) { ... }

上のコードを見ると、ORの論理演算子(||)が利用され、「iが10 または jが50 なら」という条件式を構成しています。そしてiには10が代入されていますね。

このときJVMは「iが10か?」「jが50か?」という2つの条件を両方とも評価するようなことはしません。

まず前半の「i == 10」を評価した時点で、これがtrueとわかりますので、後半の「j == 50」はわざわざ評価するまでもなく、条件式全体が成立することが確定します。よって、JVMは「j == 50」の部分の評価行為自体をスキップします。これが短絡評価です。

短絡評価のメリットとリスク

この短絡評価をうまく意識すると、パフォーマンスが少し良いコードを書けるようになります。
一方で、短絡評価はバグの原因になることがあるため注意も必要です。問題になるのは、以下のようなケースです。

while(i == 10 || ++j == 50) { ... }  // jを毎回増やしながらループ...のつもり

式の後半は「まずjに1を加える処理を行い、それが50と等しいなら」という意味です。しかし、前半部分がtrueとして成立してしまった場合は、後半部分は評価すら行われませんから、iが10の時に限って「jを1増やす」という処理も行われないのです。

他におさえておきたいポイントがあるとしたら

個人的には、あと次の「3種類の型変換」については入門書がしっかり伝えるべきないようかなと思います。

  • 明示的型変換(キャスト)
  • 代入に伴う暗黙の型変換
  • 演算に伴う暗黙の型変換

型変換や代入規則を「こういうルールだ」と解説すること自体は、さほど難しいことではありません。しかし、Javaを学び始めたばかりの学び手の頭の中に、この複雑なルールを整理された形で長時間残すことこそが、とても難しくもあり、解説する者の腕の見せ所でしょうか。

また日を改めて、そのあたりをご紹介できたらと思います。

参考

このブログ記事は、著者の個人ブログ(flairDays)から移転掲載されたものです。