2014年7月11日金曜日

AndroidでのListenerとCallbackの違い

AndroidでのListenerとCallbackの違い

Androidの勉強を始めてしばらくするとListenerやCallbackが出てきますが、Androidでの両者の違いをどう定義しているのか少し引っかかったので調べてみました。

大意としてはコールバックの方が根幹になる名詞で、リスナはコールバックに含まれてしまう、つまりどっちも同じでしょ、と言われればそうとも言えますが、個人的には「リスナ」と言われるとUIイベントをイメージし、「コールバック」と言われると内部処理をイメージしながら聞いています。

一般的な定義

  • Callback
    呼び出し先の処理が終了した時点で(呼び出し元から指定された)関数が実行される事。
    その為、呼び出し元から呼び出し先関数を実行する再に関数ポインタを渡しておく。
    呼び出し先で何らかのイベントが発生した時にそれを検知し通知する為の仕組み。
  • Listener
    概要はコールバックと同じ。言語やフレームワークにより定義はマチマチ。
    ちなみにJavaには関数ポインタが存在しないので、コールバックの実現にオブジェクトを使用している為か「リスナ」と表現される事が多い。
個人的にはUIイベント系がリスナ(イベントリスナ) 、UIイベント以外がコールバック、という感じで使い分けるものかなぁと漠然と考えていました。

Androidで気になったところ

しっくり版

Androidで最初の方に出会うのはイベントリスナだと思います。
Button button = (Button)findViewById(R.id.button); 
button.setOnClickListener = (new View.OnClickListener(){
    ...
OnClickListenerインタフェースです。

クリックイベントを取得する = UIイベント

なのでListenerという名前で実装されているのがしっくりきます。

あれれ版

同じく最初の方に出会うこれ。
public boolean onKeyDown(int keyCode, KeyEvent event){
    ...
KeyEvent.Callback インタフェースで宣言されている onKeyDown() メソッドです。KeyEvent.Callback インタフェースはActivityやViewが実装してくれているのでそれらの内部で上記のようにいきなりオーバーライドして使用する事ができます。
でもイベントリスナ(= UIイベント)なのにインタフェース名が Callback …解せない…

そう言えば

SurfaceHolder.Callback というのもありました。
Surfaceの位置やサイズが変更された時に surfaceChanged(), Surfaceが作成/破棄された時に surfaceCreated(), surfaceDestroyed() が呼び出されます。
これは…
UIイベントはUIイベントなんだけど、通常ユーザ発じゃないUIイベント、という考えでリスナではなくコールバックとして実装されている、と考えれば納得…。

リファレンスを確認

上に記載したインタフェースに関してリファレンスを読んでみましたが、、、定義がない。
で、APIガイドで見つけました。
Event Listeners
An event listener is an interface in the View class that contains a single callback method. These methods will be called by the Android framework when the View to which the listener has been registered is triggered by user interaction with the item in the UI.
イベントリスナはViewクラスのインタフェースで、1つのコールバックメソッドを含みます。これらのコールバックはリスナが登録されているViewの時UI中アイテムへのユーザ操作がトリガになりAndroidフレームワークから呼ばれます。
イベントリスナの定義として、Androidフレームワークから呼ばれるのはリスナ&コールバック共に存在するので置いておくとして、以下の2点は使えそうです。
  • Viewクラスのインタフェース
  • 1つのコールバックメソッドを含む
他リスナで色々調べると、上記2点の定義に当てはまらない(Viewクラスのインタフェースではない or 複数のコールバックメソッドが含まれる)のに xxx.Listener として定義されているインタフェースが出てくる事やイベントリスナの命名規則に当てはまらない(リスナインタフェースがOnXxxListenerでなくListenerで定義されてたり)ことから、ユーザ操作から生まれるAndroidフレームワークからの通知でも、リスナとイベントリスナを分けて定義しているようです。
  • イベントリスナ
    • Viewクラスのインタフェースとして定義されている
  • リスナ
    • Viewクラス以外のインタフェースとして定義されている
まだAndroidはやり始めなので、今後意識して見ていればこの辺りの定義はもう少し詰められるかも知れないです。

まとめ

  • イベントリスナ
    • ユーザ操作により発生する通知
    • Viewクラスのインタフェース
    • 1インタフェースに1つのコールバックメソッド
    • 命名規則がある(ぽい)
    • インタフェース OnXxxListener
    • コールバックメソッド onXxx()
    • リスナ設定メソッド setOnXxxListener
  • リスナ
    • ユーザ操作により発生する通知
    • Viewクラスのインタフェースではない
    • 1インタフェースに1〜複数のコールバックメソッド
  • コールバック
    • 基本的には内部処理結果の通知

という感じでしょうか。

自分で作るとしたら、
  • UI系コントロールを拡張する時、根本部分ならイベントリスナ
  • UI系コントロールを拡張する時、下位コントロール限定ならリスナ
  • 内部処理ならコールバック  

として実装すると何となくAndroidに合う気がします。。

最後に

KeyEvent.Callbackに関してはなぜリスナでなくコールバックとして実装されているのかまだピンと来ていません。View系クラス以外でも使えるようにと考えたとしても、Listenerという名前で定義してくれた方がスッキリするんだけどな、と思うのは

・コールバックを内部処理で使う
・リスナをUIイベント系で使う

と習慣づいてしまっているからかも知れません。
コールバックの仕組みをデザインパターンに落としたものにObserverパターンというものがありますが、リスナ系にしてもコールバックにしても仕組み自体は同じものなので今回省いてます。

2014年7月4日金曜日

その9 - 「Javaプログラマ Silver SE7」

photo credit: Bobbi Newman via photopin cc



概要

以前紹介した「Java言語プログラミングレッスン 上/下」の二冊はJavaの大枠がかなり丁寧に記載されていると思いますが、今回紹介する書籍「Javaプログラマ Silver SE7」はその比ではありません。


やはり資格試験の参考書&問題集という位置づけなだけありかなり詳細な箇所まで記載されています。
この問題集をやる前にもっとふんわりしたJavaの本しか勉強してなかったら恐ろしい事になっていたかも…と思ってホッとした覚えがあります。
しかも、試しに問題をいくつかやってみると「あれ問題が分かりにくい…」とか「継承のポリモフィズムの問題だと思ったのにシグニチャの問題!?」というようなもひっかけ問題が多々あります。
しかしそれはしょうがないのです。
実際の試験もそうだからです。
この書籍は実際の試験問題の類似問題がかなりの数記載されています。繰り返しこの書籍で勉強する事で実際の試験問題の問題文や問題コード、解答文に慣れる事ができると思います。

この書籍で出せた正答率程度は実試験でも取得する事ができると思います。私の場合もこの書籍での正答率96〜98%で実試験95%、同僚も概ね同じような感じでした。
書籍での正答率 ≒ 実試験正答率
ぜひ繰り返し問題をこなしてみてください。

ポイント

最初に

まずは書籍の正誤表サイトの確認です。
せっかく勉強するのに間違いを覚えてしまってもしょうがないですから、勉強する前に上記サイトで内容を確認しましょう。

期間

私の場合は忘れっぽい&急ぎで資格を取得する必要があった、という2点からこの書籍を購入して10日で受験しました。
体力的にかなり辛かったです。

もちろん、すでにJavaを業務で使用するなりして精通されている場合は「試験問題に慣れる」事をメインにすれば短期間での受験が可能だと思います。
そうでない方で急ぐ理由が対外的なところにない方は、繰り返しこなした方がいいと思います。
あと試験に関してですが、オンラインでいつでも予約可能です。
登録が少し面倒なのと、試験予約ではかなり席が埋まっているので3日以上前には試験予約を済ませておいた方がいいと思います。
 

検証コードを書く

各ポイントでの検証コードなのでとても小さなものになると思いますが、その詳細部分が試験では問われます。
少しでも疑問に思ったらプチコードを書いてみてください。

意識するところ

実試験でもこの書籍をこなす上で同様のポイントに気を付けなければいけません。
  • 変数の宣言、初期化、初期値代入
  • オブジェクト指向関連
  • 例外(文法だけでなく例外クラスも)
  • 問題コードを素早く読んで理解する
「Java言語プログラミングレッスン」で学んだ基本をふまえ、それよりも深い部分まで問われたりします。
問題をこなすうちに問題文の癖のような部分には慣れるとおもいますので、基本部分を深めるためにもやはり検証コードを書くことは外せないと思います。
 

最後に

私はケアレスミスをしてしまうタイプなので元々100%は厳しいですが、この試験で100%とか本当に凄いと思います。
ですがJavaの勉強を始めた時からそこを意識して、基本をしっかり押さえ深く掘り下げ、コードを読み慣れれば達成できない事はないとも思います。
ぜひJavaの知識を深め100%目指してみてください。

2014年7月1日火曜日

その8 - 「Javaプログラミングレッスン 下」のまとめ




下巻まとめ

下巻も終わりJavaをひと通りこなしたところでまとめておきます。

期間

下巻は3週間くらいで書籍の通し、プラス数個のプログラム作成までこなしてしまいましょう。
もちろんプログラム自体が初めての方はもっと時間をかけるのもOKです。

理解

文法の暗記が少ないだけに、「こう書くとこう動く」という部分が増えてくると思います。
そこは上巻から引き続きコードを書いて動作をしっかり把握しておいてください。 

使いこなす

下巻は基本部分よりもそれを使用した部分(スレッド、ファイル) や広げた部分(コレクションなど)が多いので、上巻より最初に暗記する部分が少ないです。その分バリバリとプログラムを作成して「慣れる」から「使いこなす」にステップアップしたのが感じられると思います。
どんどん色々な種類のプログラムを作成してJavaでのプログラム作成に慣れていきましょう。

予告

次回はJavaの資格取得の参考書、JavaプログラマSilver SE7を紹介したいと思います。

2014年6月30日月曜日

その7 - 「Javaプログラミングレッスン 下」の進め方

photo credit: Marwa Morgan via photopin cc



進め方

この書籍の進め方は今までと同じ流れでかまいません。
まずは新たに出てくる概念であるクラスや継承、インタフェース、ポリモフィズムなどのオブジェクト指向部分や例外の基本をしっかり押さえてください。
スレッドやファイルはJavaの資格試験では範囲外になっていると思いますが、そこも含めてひと通り終えてしまいましょう。

プログラムを作る

スレッドやファイルなど資格試験範囲外の部分もひと通り終えると記載しましたが、その理由がまさに「プログラムを作る」為になります。
書籍に記載されているスレッドやファイル操作を参考にできますし、その際にデータを保存する変数にコレクションを使用してみたりそこからファイルに保存してみたり。
書籍には記載されてないですが、HTTP通信を作成して任意のサイトから画像をダウンロードして保存(通信とファイル操作)、そしてそれを複数スレッドで行う(マルチスレッド)など思いつくままに作ってみるのです。

作る際に注意したい事

1から作る

ポイントは1から自分で作る、という事です。
書籍を丸写ししていると結局自分はどこが弱いのか、が分からないままになってしまいますので、ぜひ1から書いてみてください。
分からなくなった時やシグニチャを忘れた時などはもちろん書籍を参照したり、リファレンスを参照したりしてください。
そういう進め方で作成していればどんどん何も見ずにプログラムを書けるようになるはずです。 

パーツ単位で作る

最初はパーツ単位でいいと思います。
まずは通信するプログラムを作る。
次にデータ(通信で取得したデータ形式)を保存するプログラムを作る。
最後にそれを合体させる。
それぞれにmain()メソッドが存在する独立したプログラムとして作成したものを後から合体させる事で、キャパを超えた設計で悩む時間を減らす事ができ、単体ごとに繰り返しトライアンドエラーを繰り返す事でエラー発生箇所の見極めを容易にし、品質向上にも繋がり易くなります。 

タイミング

書籍に記載されているコードを実際に入力して動かすことは都度行ったほうがいいですが、プログラムを作成してみるタイミングはどこでも構いません。
継承を終えた段階で継承を使用したプログラムの作成もいいですし、スレッドが終わった段階で継承とスレッドを使用したプログラムの作成でもかまいません。
ぜひ複数の要素を取り入れたプログラムの作成をしてみてください。
そうやってプログラムを作成していくにつれ、あやふやな記憶が繰り返し思い出され使用されることで確固たる記憶に変化し、記憶していた知識への本当の理解が進むことになると思います。

予告

次回は下巻のまとめにしたいと思います。

2014年6月29日日曜日

オブジェクト指向のこころ

中古で高値で買ってしまったんですけど…

人気書籍で中古市場で値が高騰していた「オブジェクト指向のこころ」が3月より再販されています。

歯がギリギリ言うくらい悔しいですが確かにいい書籍だったので紹介したいと思います。

概要

本書はまずなぜオブジェクト指向プログラミングが必要なのかを説明してくれます。
システムには変更が発生する → だから凝集度を高く、結合度を低くしておく
凝集度、結合度はクラス設計を行う際に必要な概念で、これを理解しているかしていないかでクラス設計時に「このフィールドをどこに追加するべきか…」「このメソッドを…」という判断がつけやすくなります。
このようにオブジェクト指向の必要性をまずはざっと再確認します。
次にクラス図の記載に使用するUMLの再確認。
そして問題のあるシステムの紹介。
オブジェクト指向を適用してその問題を解決する方法など。
そして本題のデザインパターンです。
紹介されているパターンは12程度ですが、Facade, Adapter, Strategy などの重要パターンを厳選して紹介しており、そのパターン採用に関する考察や適したシステムの紹介なども記載されています。
デザインパターンの合間にはオブジェクト指向に対して視野を広げる考え方や、エキスパートがどう設計するかの解説、などなどとても興味深い内容になっています。

感想

Javaでオブジェクト指向に初めて手を出した状態でデザインパターンどころかUMLすらふんわり程度しか知らない状態だったので、導入部分(1,2章)から正にジャストフィットな内容でした。
まずこの書籍の特筆すべき点は、「デザインパターンを事実に則した流れで解説している」というところです。
  1. 最初にとあるシステムの問題を定義します
  2. その解決策を考察します
  3. こういう形に作れば(直せば)解決すると判断します
  4. そして答えがでます
「その形ならあるじゃないかこのパターンが!
という一般的なデザインパターンの解説書の逆をいく流れです。
デザインパターンの書籍で多いのは、
「このパターンはこういう形だからこういう時に使う」
というまずはパターンありきの解説ですよね。
実際の仕事ではまずシステムの大枠や流れを考えるので当然この書籍のようなアプローチになりますから、 流れを逆にして考えなくていい、というのはとても大きい事だと思います。
自分が考える際の思考回路と同じ流れで読み進められますから。

とはいえ、デザインパターンの紹介部分ではこういう時に使う、という説明もちゃんとなされています。
上記のように仕事の流れに添って解説している部分は実際のシステムの問題を解決していくくだりで採用されている手法です。

そしてそれだけではなく、著者がシステムをいくつも作成する上で得た、
  • こういう時はこう考える
というようなノウハウも記載されています。
つまりまるで経験豊富な先輩から(事実著者はそうだと思いますが)実例を交えてオブジェクト指向や設計、デザインパターンに関しての考察やノウハウ、重要性や注意事項を順を追って教えて貰っているような気持ちになります
全編に渡ってコード例が記載されている類の書籍ではなく、あくまで「なぜこうなのか」「なぜこうするのか」「なぜこれが必要なのか」という概念を理解するという立ち位置の書籍です。
とはいえ、必要箇所ではコード例もありますし、クラス図も記載されていますのであまりに情報が不十分で何が書かれているか分からない…という事にはなりませんでした。
ただ実際業務でのシステム例が出てきたりしますので、開発者経験のある方じゃないと少し難しいかも知れないですね。
個人的にはオブジェクト指向を説明する時に車クラスだなんだと変な喩えをされる方が分かりにくいので、実際の例に基づいたこの書籍はかなり理解が進んだと思います。

その6 - 「Javaプログラミングレッスン 下」のポイント

photo credit: martinak15 via photopin cc



「Javaプログラミングレッスン 下」のポイント

下巻で特にしっかり押さえるポイントについて書きたいと思います。

目次


上巻からの続きなので11章からのスタートです。
第11章 : クラスとインスタンス
  • オブジェクト指向の中心的な概念であるクラスとインスタンスについて学びましょう
第12章 : スーパークラスとサブクラス
  • クラスを拡張する方法や、「継承」について学びます
第13章 : 例外
  • Java言語のエラー処理である「例外」について学びます
第14章 : インタフェース
  • Java言語に疑似的な「多重継承」を行わせるインタフェースと、クラス間の関係について学びます
第15章 : ガーベッジコレクション
  • メモリの管理の詳細について、また使われなくなったメモリの回収・冷静処理であるガーベッジコレクションについて学びます
第16章 : スレッド
  • 複数のスレッドを動かす「マルチスレッドプログラミング」の基礎を学びます
第17章 : パッケージ
  • クラスを分類し、名前空間を分ける「パッケージ」の使い方と作り方を学びます
第18章 : ファイル操作と入出力、クラスの調べ方
  • クラスライブラリの使い方の例として、ファイルを読み書きしたり、削除したりするプログラミングを練習します
第19章 : コレクション
  • 多くのインスタンスを管理するコレクションについて学びます
オブジェクト指向、例外の部分が上巻になかった言語として新たに出てきた箇所です。
その他はスレッドやファイル操作とJavaAPIを使用してのプログラミングに関してになります。
ちなみにスレッドやファイル操作はプログラマとして必須だと思いますが、Javaの試験(Oracle Certified Java Programmer Silver SE 7)では範囲外となっていて、Goldの方で出てきます。

下巻のポイント

上巻と同じくひと通り理解して身に付けないといけないですが、特に気をつけるポイントを。
  • オブジェクト指向
  • 例外
  • Java SE 7 で追加された機能
以降それぞれを解説します。


オブジェクト指向

11, 12, 14章の部分です。
継承、インタフェース、is a と has a の違い、ポリモフィズムなどなど、オブジェクト指向部分の基礎をしっかりと押さえる事が大事です。
ここを乗り切るとJavaコードを読むのがかなり楽になるのではないでしょうか。
コードを書いてみたり、他人のコードやJavaAPIのコードを読んだりしてオブジェクト指向のコードに慣れ親しんでください。

例外

Javaのエラー処理の部分です。
例外処理の文法やその動き以外の部分も押さえておきます。
メソッドが例外を投げる時そのメソッドをオーバーライドしたメソッドではどう記載するか(throws宣言する例外は元と同じかそのサブクラス、RuntimeExceptionやそのサブクラスは元がthrows宣言してようがしていまいがthrows宣言できる、元がthrows宣言をしていてもオーバーライドした方はthrows宣言しなくてもいい、など)や、
チェックされる例外とチェックされない例外の意味とその実際のクラス(FileNotFoundException, ArrayIndexOutOfBoundsException, などの例外やエラー系のクラス)を例外のクラス階層を踏まえた上で確認したりになります。

Java SE 7 で追加された機能

本書P.371から「Project Coin」としてまとめられていますのでひと通り把握しておく必要があります。

予告

次回は本書を使用しての勉強の進め方を記載したいと思います。

2014年6月27日金曜日

その5 - 「Javaプログラミングレッスン 上」のまとめ


上巻まとめ

下巻に移る前に上巻でのポイントをまとめておきます。

期間

上巻は2週間くらいでざっとこなしてしまいましょう。
プログラム自体が初めての方はもっと時間をかけてもいいと思います。

ただ、プログラミングの基本部分が多いだけに暗記箇所が多く、暗記の危険なところは飽きて嫌になってしまうところです。そうならないようになるべく短期間で仕上げるのがコツです。

そして飽きを防止する為にも書籍をなぞってコードを書くだけでなく、各所で何か作ってみてください。
しっかりコードを書きながら進めたのなら一巡するだけでいいと思います。
何か忘れてしまった時は都度参照してあやふやなまま放置しなければ大丈夫です。

理解

先にも書きましたが、上巻はプログラミングの基本部分が大半です。つまり他のプログラム言語でも応用の効く基本知識が多いので、万が一Javaが合わなくても他言語で使い回しが効きやすい知識になると思います。

ですので丸暗記するだけでなく「なぜこれが必要なのか」「なぜこういう手順なのか」などしっかり理解しておくといいと思います。

使いこなす

理解するだけでなく使いこなすのが重要です。
そして慣れ親しむことです。
上巻の知識だけでも色々な種類のプログラムが作れると思います。
小さくて構わないので、そらでプログラムが書けるようになるくらいJavaに慣れて使いこなしましょう。

予告

次回は「Javaプログラミングレッスン 下」に進みたいと思います。

2014年6月26日木曜日

CentOS5.1に古いJavaをインストールする


photo credit: BobMical via photopin cc




古いJavaの環境を作成する

古いJavaの環境が欲しくなったので、CentOS5.1にJava1.3を入れます。
CentOS5.1くらいならJavaも1.3だったかな?というゆるい理由でバージョンを選んでみました。色々と問題が出たら手間なのでしっかり合わせたい方はJavaの必要バージョンが乗っていた頃のOSバージョンを、どうしても最新OSが!という方は最新バージョンを使用されるのもいいと思います。
テンポラリな環境なので、VirtualBoxを使用して作成します。

各ダウンロードサイト

以下の各所から必要物をダウンロード。
全部無料です素晴らしい。
VirtualBoxをインストール後、新規作成でCentOSのisoファイルを指定してインストールまで完了させる。

CentOS5.1 に Java1.3 をインストール

ダウンロードしたJava1.3のSDKファイルに実行権限を付けます。
# chmod +x j2sdk-1_3_1_20-linux-i586.rpm.bin

実行。
# ./j2sdk-1_3_1_20-linux-i586.rpm.bin
実行するとLicense Agreementが表示されるので最後までスクロールしてyes。

生成されたrpmパッケージをインストール。
# rpm -ivh jdk-1.3.1_20.i586.rpm

alternativesを使用して設定
# alternatives --install /usr/bin/java java /usr/java/jdk1.3.1_20/bin/java 30

確認します。
$ java -version
ここでインストールしたJavaのバージョンが表示されればOKです。

libstdc++-libc6.1-1.so.2 が無いエラーが出る時

以下のエラーが出る時の対応。
/usr/java/jdk1.3.1_20/bin/i386/native_threads/java: error while loading shared libraries: libstdc++-libc6.1-1.so.2: cannot open shared object file: No such file or directory
無いものは入れます。
# yum -y install compat-libstdc++-296

バージョンが上がってしまっているので、シンボリックリンクを作成。
# ln -s /usr/lib/libstdc++-libc6.2-2.so.3 /usr/lib/libstdc++-libc6.1-1.so.2
 

最後に

Javaのコンパイラ(javac)の方のバージョンも合わせる時は上記alternativesの部分でjavacの分も設定します。
これで環境作成は終了です。

2014年6月25日水曜日

その4 - 「Java言語プログラミングレッスン 上」の進め方

photo credit: Alejandro (Lì Delfos) via photopin cc



進め方

前回この書籍に関して勉強法を記載しましたが、これといって勉強法にこだわりがなければ書籍に従ってコードを書きながら著者の解説を読み込み、実行結果を確認し、ページを進めていくという王道で問題ありません。
その際もきっちり記憶に残るように前日の思い出しや重要箇所の書き出しなどは必ず行うようにしておくのがいいと思いますが、この時点では細かい部分まで完璧を目指すのではなく、とにかく書籍をひと通りやり遂げる事を第一の目的にしてください。
では実際の書籍、「Java言語プログラミングレッスン 上」の進め方を記載していきます。

コードを書く

例えばP.17だとList 1-1にサンプルコードがあるのでそのまま自分でも入力し、「コンパイルして実行してみよう」との言葉通りコンパイル、実行します。
P.17 List 1-1
public class Hello {
    public static void main(String[] args) {
        System.out.println("Hello!");
    }
}
続いてコンパイル、実行します
C:\WORK> javac Hello.java
C:\WORK> java Hello
Hello!
以降P.26まで上記のコードの説明と、少し改変してみた結果の解説などが記載されていますのでその部分も上記と同じようにコードを書き、コンパイルし、実行します。

理解を深める

そしてその上でさらに自分なりの改変を加えたり、疑問点を検証したりします。この辺りは今までで学んだ知識上から発生する改変や検証でかまいません。
例えば上記のHelloクラスだとすると…
  • public がないとどうなるの?
  • class がないとどうなるの?
  • ファイル名をそのまま(Hello.java)にクラス名をHelloから他の名前に変えたらどうなるの?
  • System.out.println() メソッドをリファレンスで調べてみる
などなど、(以降も書籍を読み進めれば解消するでしょうが)たくさんの疑問が発生します。そういう時はcontentsページや最後の索引ページで書籍内 (上巻内)に情報が記載されているかどうか確認し、あれば読んでみる、そしてコードを書いて検証してみる、という事を繰り返してください。
部分的に先のページを読むことになりますが、その事自体は問題ありませんしむしろ目に馴染んでいいです。ただあまりに今の知識からだと負荷が高い先まで進むとなると、読むのも少し辛くなってくると思います。そういう時はその時点で途中になっている章内を全て終えてしまってから参照してみてください。気付かなかっただけで章内で追記されている事もありますし、他から理解が進んでついでに疑問が解消する事もあります。
そうでなかった場合は疑問点をメモしておき、知識を積み上げつつ適切なタイミングで調査、検証、理解、となると思います。
重要な事は疑問をもつ事です。疑問を持つと強く記憶に残り、調査・検証などで理解が定着しやすくなります。ただあまりに時間がかかる場合はスルーして次にとりかかった方がよいです。軽めの疑問で5分、重目で15分、という感じで調査・検証にかける時間を区切ってしまい、解決できない場合現状の知識量不足、と切り捨てて次に進みます。
ただその場合も上に記載した通り、疑問点はメモで残しておくなどしておくと理解漏れが発生しにくいです。

リファレンスを参照する

書籍の解説だけでなく、JavaのAPIリファレンスを参照しAPIに関する理解を深めると同時にチラっとで構わないのでなんとなく類似のクラスやメソッドに目を通したりもします。
今はまだボンヤリ程度で構わないので、とにかく書籍にJavaのクラスやメソッドが出てくる度に参照するようにしてください。

プログラムを作ってみる

自分で何かを作成したくなったタイミングで作りたいプログラムを作ってみてください。
例えば6章を終えた段階だと変数やループ文が使えるようになっていると思いますので、その段階でコマンドライン(or ターミナル)で動く簡単なゲームなどを作成してみるのです。
すると書籍を見ながらだと記述できていたmain()メソッドのシグニチャが意外とそらで書けなかったり、変数の初期化で詰まったり、プログラムの設計で悩んだりと、理解したつもりでもふんわりとしか分かっていなかった部分や、まだ作成したことのない規模のプログラム設計に関して試行錯誤する事になると思いま す。
そしてそうする事でより知識を明確にし、広げることができます。
何かプログラムを作ってみたい!と思ったらその気持を我慢せずに情熱をコードにぶつけてみてください。

最後に - 捨てる事の重要性

捨てると書きましたが「今は」捨ててください。全然OKです。
しばらく記載したような勉強法で進めていくと、「この疑問はちょっと深すぎるのかも…」とか「細かすぎて自分が嫌になる…」という感じで疑問の深度が感覚的につかめるようになると思います。
そう感じたら速やかに投げ捨てて次に進みましょう。
それはこのパターンが以下の2つどちらかだからです。
  • 細かすぎる部分まで詰めようとしている(Javaの範囲を超え始めている)
  • 書籍やネットには記載されていない深度に届き始めた
前者は投げ捨てて忘れて問題ない範囲です。続きをやりたいならJavaをある程度極めてからでOK。
後者はありがちです。書籍でそこまで記載するととんでもないページ数になってしまい読むのが嫌になるからです。書籍では基本を、しっかりした枠さえ作る事ができれば問題ありません。読み込んでコードを書いて検証しても残るような疑問は、この上下巻が終わった後の資格の本で解消される事になるので安心してください。
ネットで個人が発信している情報は「そのサイトを作成している個人の環境で」「そのサイトを作成している個人の興味の範囲で」「そのサイトを作成している個人の嗜好や趣味が反映されたスタイルで」記載されています。情報を拾えなければそうそうに諦めて次に進みましょう。

予告

次回は下巻の勉強法について記載したいと思います。