contents memorandum はてな

目次とメモを置いとく場

『スッキリわかるJava入門 実践編[第3版]』(中山清喬 インプレス 2021//2012)

著者 : 中山 清喬


スッキリわかるJava入門 実践編 第3版 - インプレスブックス


【簡易目次】
1章 インスタンスの基本操作
2章 さまざまな種類のクラス
3章 関数とラムダ式
4章 JVM制御とリフレクション
5章 非標準ライブラリの活用
6章 ファイルの操作
7章 さまざまなファイル形式
8章 ネットワークアクセス
9章 データベースアクセス
10章 基本的な開発ツール
11章 単体テストアサーション
12章 メトリクスとリファクタリング
13章 ソースコードの管理と共有
14章 アジャイルな開発
15章 設計の原則とデザインパターン
16章 スレッドによる並列処理
17章 ユーザーインタフェース制御



【目次】
まえがき(著者) [003]
dokojavaの使い方 [004]
sukkiri.jpについて [005]
CONTENTS [006-013]
本書の見方 [014]


第0章 Javaを使いこなす技術者をめざそう
0.1 ようこそ Java実践の世界へ 016
  0.1.1 「学習」から「実践」へ
  0.1.2 一緒にJavaスキルを磨く仲間たち
  0.1.3 実践へのロードマップ


  第I部 さまざまな基本機能

第1章 インスタンスの基本操作
1.1 インスタンスの5大基本操作 024
  1.1.1 Objectクラスに備わる基礎知識

1.2 インスタンスの文字列表現 025
  1.2.1 toString()の責務
  1.2.2 toString()をオーバーライドする

1.3 インスタンスの等価判定 027
  1.3.1 等価と等値の違い
  1.3.2 equals()のオーバーライド
  1.3.3 コレクションとequals()
  1.3.4 配列の等価判定

1.4 インスタンスの要約 033
  1.4.1 HashSetでremove()できない自体
  1.4.2 HashSetの内部動作
  1.4.3 HashCode()のオーバーライド

1.5 インスタンスの順序付け 038
  1.5.1 インスタンスの並び替え
  1.5.2 Comparableインタフェースの実装
  1.5.3 コンパレータの利用

1.6 インスタンスの複製 044
  1.6.1 コピーと参照
  1.6.2 cloneメソッド
    ①Cloneableインタフェースを実装する
    ②clone()をpublicでオーバーライドする
  1.6.3 複製の失敗
  1.6.4 深いコピーと浅いコピー

1.7 この章のまとめ 052
1.8 練習問題 053
1.9 練習問題の解答 055


第2章 さまざまな種類のクラス
2.1 型安全という価値 060
  2.1.1 もし型がなかったら
  2.1.2 型を用いるメリット

2.2 ジェネリクス 064
  2.2.1 昔のArrayList
  2.2.2 ジェネリクスgenerics
  2.2.3 ジェネリクス活用の前知識
  2.2.4 ジェネリクスの活用
  2.2.5 ジェネリクスの制限
  2.2.6 ジェネリクスメソッド

2.3 列挙型 075
  2.3.1 講座種別を引数で受け取る
  2.3.2 列挙型[enum type]
  2.3.3 staticインポート宣言

2.4 インナークラス[inner class] 080
  2.4.1 クラスの中で定義するクラス
  2.4.2 メンバクラス[member class]の宣言と利用
  2.4.3 ローカルクラス[local class]の宣言と利用
  2.4.4 匿名クラス[anonymous class]の利用
  2.4.5 匿名クラスの活用例
  2.4.6 インナークラスのまとめ

2.5 null安全性 089
  2.5.1 Optionalクラス
  2.5.2 null安全に配慮する

2.6 この章のまとめ 093
2.7 練習問題 094
2.8 練習問題の解答 095


第3章 関数とラムダ式
3.1 関数オブジェクト[function object] 098
  3.1.1 第1級オブジェクト[first-class object]
  3.1.2 関数[function]とは
  3.1.3 関数とメソッドの違い
    ①メソッドとは、クラスに属する一種の関数である
    ②関数にとって名前は重要ではなく、必須ではない

3.2 関数の代入 103
  3.2.1 関数オブジェクトの代入
  3.2.2 Function型とそのバリエーション
  3.2.3 オリジナルの関数インタフェース

3.3 ラムダ式 110
  3.3.1 関数をその場で作る
  3.3.2 ラムダ式の省略記法
  3.3.3 クロージャ

3.4 関数オブジェクトの活用 115
  3.4.1 関数を利用するメリット
  3.4.2 関数オブジェクトの身近な活用例

3.5 StreamAPI 119
  3.5.1 データ集合に対して用いられる高級関数
  3.5.2 ストリームの生成
  3.5.3 データ処理メソッドの使い方
  3.5.4 Lsitとして取り出す
  3.5.5 中間処理メソッドの利用

3.6 この章のまとめ 128
3.7 練習問題 129
3.8 練習問題の解答 130


第4章 JVM制御とリフレクション
4.1 JVMへのアクセス 134
  4.1.1 JVM自体を制御する

4.2 JVMの終了 135
  4.2.1 System.exit()

4.3 外部プログラムの実行 136
  4.3.1 ProcessBuilderクラス

4.4 システムプロパティの利用 137
  4.4.1 JVMが内部に持つシステム情報
  4.4.2 システムプロパティの取得
  4.4.3 環境依存を排除する
  4.4.4 システムプロパティの設定

4.5 ロケールと国際化 143
  4.5.1 ロケール[locale]
  4.5.2 タイムゾーン[time zone]

4.6 メモリに関する状態の取得 147
  4.6.1 JVMの内部メモリ
  4.6.2 3つのメモリ指標

4.7 リフレクション 150
  4.7.1 実行時型情報[RTTI:run-time type information]
  4.7.2 型情報の取得と操作
  4.7.3 メンバの取得と操作
  4.7.4 リフレクションの用途
    ① テストや解析のために、privateメンバを操作したい場合
    ② メンバ名を用いた特殊な処理を作り込みたい場合
    ③ 利用するクラスを動的に追加・変更できるようにしたい場合

4.8 この章のまとめ 156

4.9 練習問題 157
4.10 練習問題の解答 158


第5章 非標準ライブラリの活用
5.1 ライブラリ[library]とは 162
  5.1.1 すでに存在するクラスの活用
  5.1.2 2つの利用方法
    方法① 相手からソースコード[source code]をもらう
    方法② 相手からバイナリモジュール[binary module]をもらう
  5.1.3 JAR[Java Archive]形式での提供

5.2 クラスパスのおさらい 165
  5.2.1 ライブラリが動かない
  5.2.2 クラスパス[class path]

5.3 commons-langを使ってみよう 169
  5.3.1 Commonsプロジェクト
  5.3.2 commons-langの入手
  5.3.3 EqualsBuilderを使う
  5.3.4 HashCodeBuilderを使ってみる

5.4 ログ出力ライブラリ 173
  5.4.1 さまざまなロガーライブラリ[Logger Library]
  5.4.2 簡単なログの出力
  5.4.3 ロガー実装の切り替え

5.5 オープンソースとライセンス 177
  5.5.1 オープンソースと商用製品
  5.5.2 ソフトウェアとライセンス
  5.5.3 ライセンスに違反しないために
  5.5.4 代表的なOSSライセンス
    パブリックドメイン
    BSD系ライセンス
    GPL系ライセンス
  5.5.5 コピーレフトcopyleft

5.6 この章のまとめ 184
5.7 練習問題 185
5.8 練習問題の解答 186


  第II部 外部資源へのアクセス

第6章 ファイルの操作
6.1 ファイル操作の前提知識 190
  6.1.1 ファイル操作の基本手順
  6.1.2 2種類の読み書き方法

6.2 テキストファイルの読み書き 193
  6.2.1 書き込み
  6.2.2 読み取り

6.3 バイナリファイルの読み書き 198
  6.3.1 2種類のファイル
  6.3.2 FileOutputStreamとFileInputStream
  6.3.3 文字とバイトの関係
  6.3.4 日本語と文字コード体系

6.4 ファイル操作の落とし穴 203
  6.4.1 恐ろしいファイルの閉じ忘れ
  6.4.2 正しい例外処理

6.5 ストリームの概念 207
  6.5.1 ストリームとは?
  6.5.2 さまざまなストリーム
    標準出力、標準エラー出力、標準入力
    文字列やバイト配列につながるストリーム

6.6 フィルタの活用 214
  6.6.1 フィルタ[filter]とは
  6.6.2 フィルタの特徴
    特徴① Filter ~クラスを継承している
    特徴② 単独で存在できず、ストリームに接続する形で生成する
    特徴③ 複数のフィルタを連結することができる
  6.6.3 バッファリングフィルタ[buffering filter]
    メリット① 処理性能の向上
    メリット② まとまった単位でデータを読める

6.7 ファイルシステムの操作 219
  6.7.1 ファイル自体を操作する
  6.7.2 Fileクラスの懸念点と解決策

6.8 この章のまとめ 222
6.9 練習問題 223
6.10 練習問題の解答 224


第7章 さまざまなファイル形式
7.1 データフォーマット 228
  7.1.1 データフォーマットとは

7.2 CSV形式 230
  7.2.1 汎用フォーマット
  7.2.2 CSV(Comma-Separeted-Values)
  7.2.3 CSVの読み書き

7.3 プロパティファイル形式 234
  7.3.1 プロパティファイル
  7.3.2 プロパティファイルの読み取り
  7.3.3 プロパティファイルの書き込み
  7.3.4 リソースバンドル

7.4 XML形式 241
  7.4.1 XML[eXtensible Markup Language]とは
  7.4.2 XMLの扱い

7.5 JSON形式 244
  7.5.1 JSONJavaScript Object Notation]形式とは
  7.5.2 JSON形式ファイルの読み書き

7.6 オブジェクトの直列化 249
  7.6.1 ファイル保存に関する不満
  7.6.2 Java直列化機構の概要
  7.6.3 直列化の基本的な使い方
  7.6.4 直列化される対象
  7.6.5 シリアルバージョンUID

7.7 さまざまなフォーマット 256
  7.7.1 より高度なフォーマットと操作ライブラリ
  7.7.2 Microsoft Office形式
  7.7.3 アーカイブファイル形式
  7.7.4 音声形式
  7.7.5 画像形式

7.8 この章のまとめ 263
7.9 練習問題 264
7.10 練習問題の解答 265


第8章 ネットワークアクセス
8.1 ネットワーク APIの全体像 268
  8.1.1 高水準命令と低水準命令
  8.1.2 Webページを取得しよう
  8.1.3 java.net.URLクラスの利用手順

8.2 Socketを用いた低水準アクセス 273
  8.2.1 低水準APIの特徴と理解の鍵
  8.2.2 TCP/IPの基礎
  8.2.3 Socketを用いた接続と切断
  8.2.4 上位プロトコルの利用

8.3 サーバ側ソフトウェアの開発 279
  8.3.1 接続を待つプログラムを作る

8.4 HTTPとWebAPI 281
  8.4.1 HTTPの新たな用途
  8.4.2 HTTPの基礎と全体像
  8.4.3 HTTPレスポンスの構造
    1. ステータスコード(status code)
    2. レスポンスヘッダ(response header)
    3. レスポンスボディ(response body)
  8.4.4 HTTPリクエストの構造
    1. リソースパス(resource path)
    2. リクエストメソッド(request method)
    3. クエリパラメータ(query parameter)
    4. リクエストヘッダ(request header)
    5. リクエストボディ(request body)
  8.4.5 WebAPI
  8.4.6 WebAPI仕様とREST[REpresentative State Transfer]
  8.4.7 JavaからのWebAPIアクセス
    1. HttpClientインスタンスを生成する
    2. HttpRequestインスタンスを生成する
    3. リクエストの実行とHttpResponseの取得

8.5 この章のまとめ 297
8.6 練習問題 298
8.7 練習問題の解答 300


第9章 データベースアクセス
9.1 データベースとは 304
  9.1.1 データベースとは
  9.1.2 データベースの特徴
  9.1.3 代表的なデータベース製品

9.2 データベースの基本操作 310
  9.2.1 データベースの基本構造
  9.2.2 4つの基本操作
  9.2.3 データベースとの接続
  9.2.4 データベース利用のためのAPI

9.3 データベースの接続と切断 315
  9.3.1 JDBCJava Database Connectivity]をマスターするコツ
  9.3.2 基本パターン
  9.3.3 STEP 0 事前準備
    STEP 0-1 JDBCドライバの準備
    STEP 0-2 JDBCドライバのロード
  9.3.4 STEP 1 接続の確立
  9.3.5 STEP 2 接続の切断
  9.3.6 STEP 3 SQL送信に関する各種パターン

9.4 更新系SQL文の送信 321
  9.4.1 更新系SQL文送信の流れ
  9.4.2 STEP 2-①-1 SQL文送のひな形の準備
  9.4.3 STEP 2-①-2 ひな形に値を流し込む
  9.4.4 STEP 2-①-3 SQL文をDBMSに送信する
  9.4.5 STEP 2-①-4 成否判定を行う
  9.4.6 STEP 2-①-5 パラメータの異なるSQL文を何度も送る

9.5 検索系SQL文の送信 326
  9.5.1 検索系SQL文送信の流れ
  9.5.2 STEP 2-②-3 検索系SQL文の送信

9.6 結果表の処理 328
  9.6.1 ResultSetの操作
  9.6.2 複数行の結果表処理パターン
  9.6.3 単一行の結果表処理パターン

9.7 Java DBのデータ型 331
  9.7.1 データ型の対応と注意すべき型
  9.7.2 日時情報の格納と取り出し
  9.7.3 java.sqlパッケージの日時関連クラス

9.8 トランザクション処理 334
  9.8.1 トランザクションとは
  9.8.2 トランザクションの利用
    setAutoCommit() ――接続確立した直後
    commit() ―― 一連のSQL文をすべて送信し終わったとき
    rollback() ――途中で異常を検知したとき

9.9 この章のまとめ 340
9.10 練習問題 341
9.11 練習問題の解答 342


  第III部 効率的な開発の実現

第10章 基本的な開発ツール
10.1 Javaが備える基本ツール 350
  10.1.1 実践の難しさ
  10.1.2 開発効率を高める3つの方法

10.2 JDKJava Development Kit] 352
  10.2.1 JavaJDKの関係
  10.2.2 JDKとライセンス

10.3 javadoc ――仕様書の自動生成 357
  10.3.1 仕様書とは
  10.3.2 仕様書の自動生成
  10.3.3 Javadocの基本的な使い方
  10.3.4 Javadocでよく使うオプション指定
  10.3.5 詳細な解説文を出力する
  10.3.6 Javadocタグの利用

10.4 javac ――コンパイル 365
  10.4.1 javacコマンドとは
  10.4.2 アノテーション[annotation]
  10.4.3 @SuppressWarnings ――警告を抑制する
  10.4.4 @Override ――オーバーライド宣言
  10.4.5 @Deprecated ――非推奨の宣言

10.5 jar ――アーカイブの操作 369
  10.5.1 jarコマンドとは
  10.5.2 jarコマンドの基本的な利用方法
  10.5.3 マニフェストファイル
  10.5.4 Main-Classエントリ

10.6 java ―― JVM の起動と実行 373
  10.6.1 javaコマンドとは
  10.6.2 ヒープとスタック
  10.6.3 ガベージコレクションGC
  10.6.4 GCの落とし穴
    注意点1 GCがいつ動作を開始するかは制御できない
    注意点2 GCが動作するときにはファイナライザ[finalizer]
    注意点3 GCが動作している間、ほかの計算処理などは完全に停止する
  10.6.5 メモリリークに注意しよう

10.7 jshell ―― Javaの対話的実行 380
  10.7.1 JavaのためのREPL[Read-Eval-Print Loop]
  10.7.2 JShellの基本的な使い方

10.8 統合開発環境 382
  10.8.1 統合開発環境と代表的な製品

10.9 Ant 383
  10.9.1 ビルドの自動化
  10.9.2 Antとは

10.10 Maven 386
  10.10.1 より高度な自由化
  10.10.2 POM[project object model]
  10.10.3 標準フォルダ構造
  10.10.4 Maven標準コマンドの実行
  10.10.5 プロジェクトサイトの生成
  10.10.6 依存アーティファクトの宣言と自動取得

10.11 この章のまとめ 399
10.12 練習問題 400
10.13 練習問題の解答 402


第11章 単体テストアサーション
11.1 不具合に対するアプローチ 406
  11.1.1 「完成」の基準
  11.1.2 品質の高さの度合い
  11.1.3 部品化とテスト
    単体テスト[Unit Test]
    結合テスト[Integration Test]
    総合テスト[System Test]

11.2 単体テストのやり方 412
  11.2.1 テストクラスとは
  11.2.2 テストクラスを作成する
  11.2.3 テストクラスで稼働クラスをテストする
  11.2.4 二度目のテスト実行
  11.2.5 テストクラスを使う理由
  11.2.6 良いテストケースとは

11.3 JUnitを用いたテスト 421
  11.3.1 テスティングフレームワーク
  11.3.2 JUnitとは
  11.3.3 JUnitテストクラスの記述
  11.3.4 テストの実行

11.4 アサーション 429
  11.4.1 アサーションとは
  11.4.2 アサーションの記述方法
  11.4.3 AssertionErrorが例外でなくエラーである理由
  11.4.4 アサーションを有効にする
  11.4.5 アサーションの注意点

11.5 この章のまとめ 436
11.6 練習問題 437
11.7 練習問題の解答 438


第12章 メトリクスとリファクタリング
12.1 品質の「見える化」 442
  12.1.1 本当に大丈夫?
  12.1.2 品質を「見える化」する
  12.1.3 コードのカバレッジ
  12.1.4 カバレッジの数え方
  12.1.5 カバレッジの計測
  12.1.6 カバレッジ中毒にご用心

12.2 さまざまなメトリクス 449
  12.2.1 便利なメトリクスたち
  12.2.2 規模を大まかに把握できるLOC[Lines of Code]
  12.2.3 メソッドの複雑さを示すCC[Cyclomatic Complexity]
  12.2.4 クラス複雑度を示すWMC[Weighted Method Class]

12.3 リファクタリング 451
  12.3.1 「カイゼン」しよう
  12.3.2 リファクタリングとは
  12.3.3 単体テストの重要性
  12.3.4 リファクタリングの注意点

12.4 コードの静的解析 456
  12.4.1 静的解析とは?
  12.4.2 SpotBugs ――バグの種を検出
  12.4.3 Checkstyle ――スタイルの統一

12.5 この章のまとめ 460
12.6 練習問題 461
12.7 練習問題の解答 462


第13章 ソースコードの管理と共有
13.1 チームによる開発 466
  13.1.1 チームによる分業
  13.1.2 分業の特徴

13.2 ソースコードの共有 469
  13.2.1 ソースコード共有の課題
  13.2.2 バージョン管理システムとは
    Subversion
    Git

13.3 Gitの基礎 473
  13.3.1 Git入門のアプローチ
  13.3.2 Git利用の構図と3つの「場所」
    場所1 ワークツリー(working tree)
    場所2 ローカルレポジトリ(local repository)
    場所3 リモートレポジトリ(remote repository)
  13.3.3 Gitに関する3つの「アクション」
    アクション1 commit
    アクション2 push
    アクション3 pull
  13.3.4 「場所」の関係を結ぶためのアクション

13.4 Gitツールの利用 479
  13.4.1 Gitクライアントのインストール
  13.4.2 Gitクライアントの初期設定
  13.4.3 レポジトリの認証とclone
  13.4.4 ファイルの修正とcommit
  13.4.5 pushの実施

13.5 競合の発生と解決 487
  13.5.1 競合の発生
  13.5.2 pullによる統合
    注意点① 「統合した歴史」を改めてpushする必要がある
    注意点② 未commitのファイルがあるとpullに失敗することがある
    注意点③ 歴史を「いい感じ」に統合できないことがある

13.6 commit の制御 497
  13.6.1 一部のファイルだけをcommitする
  13.6.2 ワークツリーとステージの状態を調べる
  13.6.3 過去のcommitの閲覧
  13.6.4 コミットコメントの修正
  13.6.5 commitの取り消し
  13.6.6 .gitignoreファイル
  13.6.7 .gitkeepファイル

13.7 ブランチ 505
  13.7.1 より高度なGit活用に向けて
  13.7.2 ブランチとは
  13.7.3 ブランチを作る
  13.7.4 ブランチのマージ

13.8 Gitサーバ 512
  13.8.1 Gitサーバの利用
  13.8.2 フォークとプルリクエス

13.9 この章のまとめ 516
13.10 練習問題 519
13.11 練習問題の解答 520


第14章 アジャイルな開発
14.1 チーム開発の基盤 522
  14.1.1 チーム開発に必要なもの

14.2 共通の言葉 523
  14.2.1 技術者が使うさまざまな言葉
  14.2.2 UML ――統一モデリング言語
  14.2.3 クラス図
  14.2.4 シーケンス図
  14.2.5 ユースケース

14.3 共通の手順 531
  14.3.1 開発の工程と成果物
  14.3.2 代表的な開発プロセス
  14.3.3 開発を支える価値観

14.4 アジャイルという価値観 536
  14.4.1 コードと人と変化を重視する
  14.4.2 アジャイル開発の進め方

14.5 エクストリーム・プログラミング(XP) 539

  14.5.1 XPとは
  14.5.2 ペアプログラミング
  14.5.3 テスト駆動開発[TDD:Test Driven Development]
  14.5.4 継続的インテグレーション

14.6 スクラム(Scrum) 548
  14.6.1 スクラムとは
  14.6.2 Scrumが定める3つのルール
    ① プロダクトオーナー
    ② 開発メンバー
    ③ スクラムマスター
  14.6.3 スクラムで用いられる3つのリスト
    ① プロダクトバックログ(product backlog)
    ② スプリントバックログ(sprint backlog)
    ③ 障害リスト(impediment lsit)
  14.6.4 スクラムが定める4つのミーティング
    ① スプリント計画ミーティング
    ② デイリースクラム
    ③ スプリント・レビュー
    ④ ふりかえり(スプリント・レトロスペクティブ)
  14.6.5 デイリースクラムの実践ポイント

14.7 継続的デプロイメント 554
  14.7.1 継続的インテグレーションの自動化
  14.7.2 ビルドエージェント[build agent]の活用
  14.7.3 継続的デプロイメント[CD:continuous deployment]

14.8 この章のまとめ 558
14.9 練習問題 559
14.10 練習問題の解答 560


  第IV部 より高度な設計をめざして

第15章 設計の原則とデザインパターン
15.1 優れた設計の原則 564
  15.1.1 設計の優劣

15.2 コード記述全般に関する原則 566
  15.2.1 同じことを何度もやらない(DRY[Don't Repeat Yourself])
  15.2.2 意味や意図を明確に記述する(PIE[Program Intently and Expressively])
    (1) 適切な名前を選ぶ
    (2) マジックナンバーに名前を付ける
    (3) 複雑な処理に名前を付ける

15.3 クラスの設計に関する原則 569
  15.3.1 クラスに与える責務は1つだけ(SRP[Single Responsibility Principle])
  15.3.2 既存部分の修正なしで拡張可能に(OCP[Open–Closed principle])

15.4 クラスの関係に関する原則 571
  15.4.1 クラスの依存関係
  15.4.2 安定したものに依存する(SDP[Stable Dependencies Principle])
  15.4.3 循環依存、相互依存を避ける(ADP[Acyclic Dependencies Principle])

15.5 デザインパターン 574
  15.5.1 設計のパターン
  15.5.2 パターンを利用するメリット
    メリット① 開発者間のコミュニケーションが円滑になる
    メリット② オブジェクト指向や設計原則の理解が深まる
  15.5.3 GoFパターン

15.6 Facade ――内部を隠してシンプルに 579
  15.6.1 引越手続きの煩雑さ
  15.6.2 「表の窓口」役を作る

15.7 Singleton ――唯一無二の存在 581
  15.7.1 「世界に一つだけの花」の設計図を考える
  15.7.2 1回しかnewできなくする方法

15.8 Strategy ――プラグインの切り替え 585
  15.8.1 複数のアルゴリズムを選べるしくみ
  15.8.2 さらに拡張性を高める

15.9 TemplateMethod ――大まかなシナリオ 590
  15.9.1 すべては確定できないけれど、流れだけは確定したい
  15.9.2 流れは確定し、細部は任せる
  15.9.3 TemplateMethodの応用例

15.10 モジュール 596
  15.10.1 「優れた設計」の共演のために
  15.10.2 JARマニフェストによるモジュール名宣言
  15.10.3 module-infoによるモジュール定義
  15.10.4 パッケージのアクセス制御
  15.10.5 依存の表明と連鎖への反応
  15.10.6 モジュールパスからのJARファイルの読み込み
  15.10.7 モジュールシステム[module system]の必要性
    問題1 「publicなクラスがpublicすぎる」問題
    問題2 「同じクラスの別バージョンを利用している」問題

15.11 この章のまとめ 612
15.12 練習問題 613
15.13 練習問題の解答 614


第16章 スレッドによる並列処理
16.1 処理効率の追求 618
  16.1.1 複数処理の同時実行
  16.1.2 スレッド

16.2 Javaにおける並列処理 621
  16.2.1 Threadクラスの利用
  16.2.2 Runnableの利用
  16.2.3 そのほかの使い方と注意点
    (1) スレッドはrun()を実行し終えると自動消滅する
    (2) stop()の利用は御法度
    (3) JVMは全スレッドの終了をもって終了する
    (4) join()で別スレッドの終了を待つことができる
    (5) OSによって動作に違いが生じる可能性がある
    (6) 例外はほかのスレッドに伝播しない
    (7) 同時に1つの変数を利用するとデータが壊れる

16.3 スレッドセーフな設計 629
  16.3.1 スレッドの競合
  16.3.2 synchronizedによる排他制御
  16.3.3 ほかのスレッドに道を譲る

16.4 スレッド活用と高水準API 634
  16.4.1 スレッド活用の難しさ
  16.4.2 スレッドセーフなデータ型
  16.4.3 スレッドにまつわるデザインパターン
  16.4.4 スレッドを正しく「おそれる」

16.5 この章のまとめ 641
16.6 練習問題 642
16.7 練習問題の解答 643


第17章 ユーザーインタフェース制御
17.1 ユーザーインタフェース 646
  17.1.1 Javaで開発可能なアプリケーション

17.2 ウィンドウUIの基礎 648
  17.2.1 ユーザーインターフェースの種類
  17.2.2 ウィンドウUIの基本要素
  17.2.3 ウィンドウUIを実現するJava API

17.3 Swing APIの基礎 651
  17.3.1 ウィンドウの種類
  17.3.2 フレームの利用
  17.3.3 ウィンドウアプリケーションとスレッド
  17.3.4 ウィジェットの生成と追加

17.4 レイアウト 657
  17.4.1 座標指定による配置
  17.4.2 レイアウトマネージャ
  17.4.3 レイアウトのネストによる配置

17.5 イベントハンドリング 665
  17.5.1 イベントとイベントハンドラ
  17.5.2 ボタンのクリックイベントに対応する
  17.5.3 さまざまなイベントへの対応
  17.5.4 アダプタクラスの利用
  17.5.5 イベントディスパッチスレッド[EDT: event dispatch thread]の制約
  17.5.6 終わりに

17.6 この章のまとめ 680
17.7 練習問題 681
17.8 練習問題の解答 682


エラー解決・虎の巻 [691-715]
あとがき & 参考文献一覧(著者) [716]
索引 [717-726]






【メモ】
・改訂履歴
第1版 2012
第2版 2014
第3版 2021


・列挙される見出しが不統一だったので、上記目次では勝手に補完しておいた。本文では286頁。


  [変更前]

  8.4.4 HTTPリクエストの構造
    1. リソースパス(resource path)
    2. リクエストメソッド(method)
    3. クエリパラメータ(query parameter)
    4. リクエストヘッダ(request header)
    5. リクエストボディ(request body)

  ↓
  [変更後]

  8.4.4 HTTPリクエストの構造
    1. リソースパス(resource path)
    2. リクエストメソッド(request method)
    3. クエリパラメータ(query parameter)
    4. リクエストヘッダ(request header)
    5. リクエストボディ(request body)