『Java本格入門』を片手に Java の勉強を始めた息子のために

# 前置き

息子が「プログラミング勉強したい」と言い出したので、「これやっとけば？」と『Java本格入門』と家に転がっていたオンボロ PC を与えて放置中です。（ひどい）
それだけではあんまりなので、『Java本格入門』について自分でも改めて読み返して、気になったところとか自分ならこうするなーというところをまとめておこうと思いました。

[Java本格入門](https://books.rakuten.co.jp/rb/14782914/（)

# お断り

- あくまでも対象は私の息子です
- あくまでも個人の感想です
- うちにあるのは初版第1刷です

## P.18 1-1-4  Java が実行される流れ

> 「C言語など、CPUが理解できる機械語のプログラムを生成して実行する言語よりも処理速度が遅い」と言われていた時代がありました。

> C言語と比較しても遜色のない速度にまで向上しています。

＿人人人人人人＿
＞　突然のC　＜
￣Y^Y^Y^Y^Y￣

すいません、一度やってみたかったんです。

冗談はさておき、この本を手に取った初学者・初心者の何割が C 言語を経験しているだろうか、とはちょっと思いました。こういうのってもはや、何故か今だに一部で言われ続けている「Java は遅い」という言説に対するカウンターとしてしか機能しないのではないかという気がしないでもないです。

## P.19 1-2-1 Java のインストール

Windows のみかー。
こういうのってだいたい Windows のみか、Mac のみか、その両方か、なんですよね。それ以外を使うような人は自己責任でって話ですよね。
という Xubuntu 使いの愚痴でした。

なお、息子に与えた PC は Xubuntu 08.04 が入っていて、JDK6(!) と Eclipse (3.3 くらい？）がすでにインストール済みだったので、この辺はスルーしていると思いますが。

## P.32 2-1-4 演算子

### 論理演算やビット演算

算術や関係演算子はまあ算数の知識でだいたいわかるからいいとして、論理演算やビット演算ってサラッと書かれて意味がわかるのだろうか？いや、プログラミング言語を習得しようという人間はコンピューターサイエンスの基礎の基礎くらいは理解していて当然か？じゃあそれどこでどうやって学んでおけばいいの？　とかとか。
初学者に読ませるという視点であらためて入門書を読むと、今まで何も気にせず通り過ぎていたところが急に気になりだしたりします。
そういう意味では、「プログラミング勉強したい」という息子にいきなり『Java本格入門』渡して読ませる私は筋が悪いですね。

### 余談

なので「『○○○○』は初心者にもおすすめです」という評価は上から目線の可能性があるので盲信してはいけない気がします。自分が当たり前だと思っていることが、他の人には当たり前じゃないかもしれないよ、という意味で。

## P.37 文字列結合に利用する演算子

> 多くの演算子は数値や真偽値の演算に利用しますが、二項演算子の「+」と代入演算子の「+=」は、文字列の結合に利用することができます。

これ、String 型については JLS で特に規定されていることに少しても触れておいたほうがいいのではないかと思いました。（Chapter7 で String 型について詳細に触れられていますけど、そこでもそういう話はなさそうに見えた）
String 型が特別扱いされていること（それだけが理由ではないですけど）とそれに対する無理解によって無用の混乱を招いているところを時々目にしますので。

## P.42 while 文 / do ... while 文

いやー、最近 while 書いてないですね、という話はさておき、break の説明で

> 特にループを終了する条件が複雑な場合や、条件が複数ある場合などは、この形で記載すると便利です。

とありますが、それは気をつけないとスパゲティコードになる未来が見えます。まあそこをどう解決するかはもうちょっと先の話なのかもしれませんけど。

## P.45 2-2-1 クラスの宣言

生徒が `MAX_SCORE` 持ってるのかー。

### 余談

いやでも、簡単なサンプルコードで本質的なことを表現するのって難しいですよね、っていうか無理ですよね・・・。
私もオブジェクト指向を題材とした社内勉強会の講師をやって大爆死した経験があるので痛いほどよくわかります。ていうか今思い出して胸が痛いです。

## P.49 2-2-5 main メソッド

このタイミングで main メソッドがでてくるんかー。もっと前の方でよくないかなー。と思ったんですけど、じゃあ自分ならどこに入れるか、って考えたらこれ意外と難しいですね。
Hello World の時に「main から全てが始まる」とかとりあえず言っておくのもありのような気はしますが、あの章は多分何も説明しないでとにかくやってみよう、ってことだと思いますし。

### とても余談

現実的は、仕事で Java のプログラム書いている人の中には main メソッド書いたことのない人も結構存在してそうな気がしてならない・・・。恐ろしい。

## P.59 2-4-2 変数名の後ろに_はつけない

> したがって、変数名の後ろに「_」をつけることは、もはや不要と言っていいでしょう。

その主張には 100% 同意するのですが、これ、特筆するほどメジャーな文化だったんでしょうか？
個人的にはローカル変数（メソッド）で「前」に付けるのはたまに見ましたけど（Java に限らないならよくある）、後ろアンダースコアは見たことないかもしれない。

## P.63 3-1-2 プリミティブ型

> プリミティブ型は、真偽値型と数値型、文字型からなる基本的なデータ型です。

いやいやまって、真偽値型と数値型しかないのでは。char は UTF-16 を表す「数値（integer）」ですよね。
cf. https://docs.oracle.com/javase/specs/jls/se8/html/jls-4.html#jls-4.2

### 余談

便宜上「文字型」と言うのはありと思います。

## P.66 3-1-3 参照型

new の例に String 型が使われていて、いや何もそこでよりによって String 型を使わなくてもー、と思ったんですけどその後の

> クラスからインスタンスを生成するには new キーワードを使いますが、String クラスの場合は文字列リテラルを使ってより簡潔にインスタンスを生成することができます。

この文字列リテラルの説明に繋げたかったということなんでしょうか。

## P.106 Chapter4 配列とコレクションを極める

> 本章では、ついつい知ったかぶりしてしまう Java の配列とコレクションについて

いや、別にどうということはないんですけど「ついつい知ったかぶりしてしまう」という表現がなんか刺さりました。
あと、それを言い出したら配列とコレクションに限らないような気がします。

## P.109 4-1-2 配列を初期化する

> なお、配列の宣言に使う [] は、型に付けることも、変数に付けることもできます。つまり、int[] array と int array[] のいずれでも書くことができます。しかし「int配列である」ということが明確にわかるように、前者の int[] array という書き方をおすすめします。

これ、もうちょっと突っ込んだことが JSL に書かれてますね。
cf. https://docs.oracle.com/javase/specs/jls/se8/html/jls-10.html#jls-10.2

変数に付けられてしまうのは C や C++ との親和性のためだし、なんだったら、int[] array[] みたいな書き方もできちゃいますけど、それはお勧めできないということのようです。

# あとがき

時間の制約により、一旦ここまでにさせていただきます。

もちろん、『Java本格入門』には「いいね！」と思うことも山ほど書いてあるので、むしろそういうものこそまとめてさらに広める努力をするのも必要かと思いました。
では来年の Advent Calendar でやりましょうかうそ。