本格入門
Java本格入門
~モダンスタイルによる基礎からオブジェクト指向・実用ライブラリまで
-
谷本心,阪本雄一郎,岡田拓也,秋葉誠,村田賢一郎 著
Acroquest Technology株式会社 監修 - 定価
- 3,278円(本体2,980円+税10%)
- 発売日
- 2017.4.18
- 判型
- B5変形
- 頁数
- 448ページ
- ISBN
- 978-4-7741-8909-3 978-4-7741-8947-5
概要
誕生から20年を迎え,幅広い分野のプログラミングに欠かせないJavaの基礎から応用までをしっかり解説。Javaの最新仕様(Java 8)に基づく文法から,オブジェクト指向やデザインパターン,そしてビルド,ドキュメンテーション,品質への配慮などまで,現場の開発で避けてはとおれない話もきちんとおさえました。開発やトラブルシュート経験の豊富なアクロクエストテクノロジーのメンバーが,保守性,堅牢性,性能,開発効率などの観点をふまえて書き下ろした,Java開発者必携の1冊。
こんな方にオススメ
- Javaの基本は理解できているものの実践的な知識はわからない方
- 以前からJavaを使っているもののJava 8の新たな文法はご存知ない方
- C#などほかのプログラミング言語の経験があり,Javaを新規に学ぶ方
目次
はじめに
Chapter 1 Javaの基本を知ろう ~イントロダクション~
1.1 Javaとは
- 1.1.1 Javaの特長
- 1.1.2 Javaの3つのエディションと2つの環境
- 1.1.3 Java VMの種類
- 1.1.4 Javaが実行される流れ
1.2 「Hello Java World!」を表示してみよう
- 1.2.1 Javaのインストール
- 1.2.2 Eclipseのインストール
- 1.2.3 「Hello Java World!」プログラムを作成してみよう
- 1.2.4 プログラムの実行をする
Chapter 2 基本的な書き方を身につける
2.1 Javaの基本的な記法
- 2.1.1 文とブロック
- 2.1.2 コメント
- 2.1.3 変数,型,リテラル
- 2.1.4 演算子
- 2.1.5 制御構文
2.2 クラスとメソッド
- 2.2.1 クラスの宣言
- 2.2.2 メソッドの宣言
- 2.2.3 修飾子
- 2.2.4 メソッドのオーバーロード
- 2.2.5 mainメソッド
- 2.2.6 インスタンス
- 2.2.7 thisを用いた記述の注意点
- 2.2.8 コンストラクタ
2.3 情報共有のために知っておきたい機能
- 2.3.1 Javadoc
- 2.3.2 アノテーション
2.4 名前のつけ方に注意する
- 2.4.1 クラスと変数はキャメルケースで,定数はスネークケースで
- 2.4.2 変数名の後ろに_はつけない
- 2.4.3 変数は名詞,メソッドは動詞で命名する
- 2.4.4 「不吉な匂い」がする名前に気をつける
Chapter 3 型を極める
3.1 プリミティブ型と参照型
- 3.1.1 Javaは静的型付け言語
- 3.1.2 プリミティブ型
- 3.1.3 参照型
- 3.1.3 ラッパークラス
- 3.1.4 オートボクシングとアンボクシング
3.2 クラスの作成
- 3.2.1 クラスを定義する
- 3.2.2 パッケージ
- 3.2.3 アクセス修飾子
- 3.2.4 その他のよく利用する修飾子
- 3.2.5 継承
- 3.2.6 抽象クラス
- 3.2.7 インタフェース
- 3.2.8 匿名クラス
- コラム nested class
3.3 型判定とオブジェクトの等価性
- 3.3.1 instanceof演算子
- 3.3.2 オブジェクトの等価性
3.4 型にまつわる問題を予防する
- 3.4.1 列挙型(enum)
- 3.4.2 ジェネリクス(総称型)
Chapter 4 配列とコレクションを極める
4.1 配列で複数のデータを扱う
- 4.1.1 配列の基本を理解する
- 4.1.2 配列を初期化する
- 4.1.3 配列への代入と取り出し
- 4.1.4 配列のサイズを変更する
- 4.1.5 Arraysクラスを利用して配列を操作する
- 4.1.6 可変長引数でメソッドを定義する
- コラム Comparatorか,Comparableか?
4.2 コレクションフレームワークで複数のデータを扱う
- 4.2.1 配列の限界とコレクションの特徴
- 4.2.2 代表的なコレクションと使い分けの基準
4.3. 配列に近い方法で複数の要素を扱う ~Listインタフェース
- 4.3.1 Listインターフェースの基本
- 4.3.2 Listを作成する
- 4.3.3 Listの代表的なメソッド
- 4.3.4 Listをソートする
- 4.3.5 Listを検索する
- 4.3.6 Listのイテレーション
- 4.3.7 Listの3つの実装クラスを理解する
- 4.3.8 Listの実装クラスをどう使い分けるか
4.4 キーと値の組み合わせで値を扱う ~Mapインタフェース
- 4.4.1 Mapを作成する
- 4.4.2 Mapの使い方
- 4.4.3 Mapの3つの実装クラスを理解する
- 4.4.4 Mapの実装クラスをどう使い分けるか
4.5 値の集合を扱う ~Setインタフェース
- 4.5.1 Setの初期化
- 4.5.2 Setの使い方
- 4.5.3 Setの3つの実装クラスを理解する
- コラム MapとSetの関係
- コラム ConcurrentHashMapがあるのに,ConcurrentHashSetがないのはなぜ?
4.6 その他のインタフェース
- 4.6.1 値を追加した順と同じ順に値を取得する ~Queueインタフェース
- コラム Queueとマルチスレッド
- 4.6.2 両端キューを使う ~Dequeインタフェース
Chapter 5 ストリーム処理を使いこなす ~ラムダ式とStream API~
5.1 Stream APIを利用するための基本
- 5.1.1 Stream APIでコレクションの操作はどう変わるか
- コラム Stream APIではHowではなくWhatを記述する
- 5.1.2 ラムダ式の書き方をマスターする
- 5.1.3 メソッド参照
5.2 Streamを作成する
- 5.2.1 ListやSetからStreamを作成する
- 5.2.2 配列からStreamを作成する
- 5.2.3 MapからStreamを作成する
- 5.2.4 数値範囲からStreamを作成する
5.3 Streamに対する「中間操作」
- 5.3.1 要素を置き換える中間操作
- 5.3.2 要素を絞り込む中間操作
- 5.3.3 要素を並べ替える中間操作
5.4 Streamに対する「終端操作」
- 5.4.1 繰り返し処理をおこなう終端操作
- 5.4.2 結果をまとめて取り出す終端操作
- 5.4.3 結果を1つだけ取り出す終端操作
- 5.4.4 集計処理をおこなう終端操作
5.5 Stream APIを使うためのポイント
- 5.5.1 王道はmap,filter,collect
- 5.5.2 n回の繰り返しをするIntStream
- 5.5.3 ListやMapに対して効率的に処理をおこなう
5.6 Stream APIを使ったListの初期化
- 5.6.1 Streamを用いて列挙した値からListを作成する
- 5.6.2 Streamを用いて値の範囲からListを作成する
- 5.6.3 Streamを用いて配列を作成する
Chapter 6 例外を極める
6-1 例外の基本
- 6-1-1 例外の3つの種類
- 6-1-2 例外を表す3つのクラス
- 6-1-3 例外処理の3つの構文を使いこなす
6-2 例外処理でつまずかないためのポイント
- 6-2-1 エラーコードをreturnするコードは古い
- 6-2-2 例外をもみ消さない
- 6-2-3 恐怖のthrows Exception感染
- 6-2-4 どの階層で例外を捕捉して処理するべきか
- 6-2-5 独自例外を作成する
- 6-2-6 例外のトレンド
Chapter 7 文字列操作を極める
7-1 文字列操作の基本
- 7-1-1 Stringクラスの特徴
- 7-1-2 文字列を結合する3つの方法
- 7-1-3 文字列を分割する
- 7-1-4 複数の文字列を連結する
- 7-1-5 文字列を置換する
- 7-1-6 文字列を検索する
7-2 正規表現で文字列を柔軟に指定する
- 7-2-1 文字列が正規表現のパターンに適合するかをチェックする
- 7-2-2 正規表現を用いて文字列を分割する
- 7-2-3 正規表現を用いて文字列を置換する
- 7-2-4 Stringクラスのメソッドで正規表現を使う
7-3 文字列のフォーマットと出力
- 7-3-1 文字列を出力する
- 7-3-2 MessageFormatについて
7-4 文字コードを変換する
- 7-4-1 Javaはどのような文字コードを利用しているか
- 7-4-2 Javaの文字から任意の文字コードへ変換する
- 7-4-3 任意の文字コードからJavaの文字へ変換する
- 7-4-4 文字化けの原因と対策
- 7-4-5 Stringクラスのinternメソッドで同一の文字列を探すには
Chapter 8 ファイル操作を極める
8-1 ファイル操作の基本
- 8-1-1 Fileクラスで初期化する
- 8-1-2 Pathクラスで初期化する
8-2 ファイルを読み書きする
- 8-2-1 バイナリファイルを読み込む
- 8-2-2 バイナリファイルに書き込む
- 8-2-3 テキストファイルを読み込む
- 8-2-4 テキストファイルに書き込む
- 8-2-5 Stream APIを使ってファイルを読み込む
8-3 ファイルを操作する
- 8-3-1 ファイルをコピーする
- 8-3-2 ファイルを削除する
- 8-3-3 ファイルを作成する
- 8-3-4 ディレクトリを作成する
- 8-3-5 一時ファイルを作成する
8-4 さまざまなファイルを扱う
- 8-4-1 プロパティファイル
- 8-4-2 CSVファイル
- 8-4-3 XML
- 8-4-4 JSON
Chapter 9 日付処理を極める
9-1 DateとCalendarを使い分ける
- 9-1-1 Dateクラスを利用する
- 9-1-2 Calendarクラスを利用する
- 9-1-3 DateクラスとCalendarクラスの相互変換をおこなう
9-2 Date and Time APIを利用する
- 9-2-1 Date and Time APIのメリット
- 9-2-2 日付・時間・日時をそれぞれ別クラスで扱う
- 9-2-3 年月日などを指定してインスタンスを生成できる
- 9-2-4 年月日の各フィールドの値を個別に取得できる
- 9-2-5 年月日の計算ができる
9-3 日付クラスと文字列を相互変換する
- 9-3-1 日付クラスを任意の形式で文字列出力する
- 9-3-2 文字列で表現された日付をDateクラスに変換する
- 9-3-3 SimpleDateFormatクラスはスレッドセーフではない
9-4 Date and Time APIで日付/時間クラスと文字列を相互変換する
- 9-4-1 日付/時間クラスを任意の形式で文字列出力する
- 9-4-2 文字列で表現された日付を日付/時間クラスに変換する
- 9-4-3 DateTimeFormatterクラスはスレッドセーフ
9-5 和暦に対応する
- 9-5-1 西暦を和暦に変換する
- 9-5-2 和暦を利用した日付の文字列表現と日付クラスとの相互変換
Chapter 10 オブジェクト指向をたしなむ
10-1 プリミティブ型の値渡しと参照型の値渡し
- 10-1-1 プリミティブ型と参照型の値の渡し方
- 10-1-2 操作しても値が変わらないイミュータブルなクラス
- 10-1-3 操作すると値が変わるミュータブルなクラス
- 10-1-4 イミュータブルなクラスのメリットとデメリット
10-2 可視性を適切に設定してバグの少ないプログラムを作る
- 10-2-1 Javaが使える可視性
- 10-2-2 可視性のグッドプラクティス
10-3 オブジェクトのライフサイクルを把握する
- 10-3-1 3種類のライフサイクル
- 10-3-2 ライフサイクルのグッドプラクティス
10-4 インタフェースと抽象クラスを活かして設計する
- 10-4-1 ポリモーフィズムを実現するためのしくみ
- 10-4-2 インタフェースと抽象クラスの性質と違い
- 10-4-3 インタフェースのデフォルト実装
- 10-4-4 インタフェースのstaticメソッド
Chapter 11 スレッドセーフをたしなむ
11-1 マルチスレッドの基本
- 11-1-1 マルチスレッドとは
- 11-1-2 マルチスレッドにするメリット
- 11-1-3 マルチスレッドで困ること
- 11-1-4 同時に作業する場合に起こる問題
- 11-1-5 マルチスレッドの問題に対応するのが難しい理由
11-2 スレッドセーフを実現する
- 11-2-1 スレッドセーフとは
- 11-2-2 ステートレスにする
- 11-2-3 「メソッド単位」ではなく,必要最低限な「一連の処理」に対して同期化する
Chapter 12 デザインパターンをたしなむ
12-1 デザインパターンの基本
- 12-1-1 デザインパターンとは
- 12-1-2 デザインパターンを利用するメリットとは
12-2 生成に関するパターン
- 12-2-1 AbstractFactoryパターン ~関連する一連のインスタンス群をまとめて生成する
- 12-2-2 Builderパターン ~複合化されたインスタンスの生成過程を隠ぺいする
- 12-2-3 Singletonパターン ~あるクラスについて,インスタンスが単一であることを保証する
12-3 構造に関するパターン
- 12-3-1 Adapterパターン ~インタフェースに互換性のないクラスどうしを組み合わせる
- 12-3-2 Compositeパターン ~再帰的な構造の取り扱いを容易にする
12-4 振る舞いに関するパターン
- 12-4-1 Commandパターン ~「命令」をインスタンスとして扱うことにより,処理の組み合わせなどを容易にする
- 12-4-2 Strategyパターン ~戦略をかんたんに切り替えられるしくみを提供する
- 12-4-3 Iteratorパターン ~保有するインスタンスの各要素に順番にアクセスする方法を提供する
- 12-4-4 Observerパターン ~あるインスタンスの状態が変化した際に,そのインスタンス自身が状態の変化を通知するしくみを提供する
Chapter 13 周辺ツールで品質を上げる
13-1 Mavenでビルドする
- 13-1-1 ビルドとは
- 13-1-2 Mavenの基本的な利用方法
- 13-1-3 Mavenにプラグインを導入する
13-2 Javadocでドキュメンテーションコメントを記述する
- 13-2-1 なぜJavadocコメントを書いておくのか
- 13-2-2 Javadocの基本的な記述方法
- 13-2-3 知っておくと便利な記述方法
- 13-2-4 APIドキュメントを作成する
13-3 Checkstyleでフォーマットチェックをする
- 13-3-1 Checkstyleとは
- 13-3-2 Eclipseによるフォーマットチェック
- 13-3-3 Mavenによるフォーマットチェック
13-4 FindBugsでバグをチェックする
- 13-4-1 Eclipseによるバグチェック
- 13-4-2 Mavenによるバグチェック
13-5 JUnitでテストをする
- 13-5-1 なぜ,テスト用プログラムを作って試験をするのか
- 13-5-2 テストコードを実装する
- 13-5-3 テストを実行する
13-6 Jenkinsで品質レポートを作成する
- 13-6-1 継続的インテグレーションとJenkins
- 13-6-2 Jenkinsの環境を準備する
- 13-6-3 Jenkinsでビルドを実行する
- 13-6-4 Jenkinsでレポートを生成する
Chapter 14 ライブラリで効率を上げる
14-1 再利用可能なコンポーネントを集めたApache Commons
- 14-1-1 Commons Lang
- 14-1-2 Commons BeanUtils
- 14-1-3 シャローコピーとディープコピー
14-2 CSVで複数のデータを保存する
- 14-2-1 CSVとは
- 14-2-2 Super CSVでCSV変換を効率的におこなう
- 14-2-2 CSVデータを読み込む
- 14-2-3 CSVデータを書き込む
14-3 JSONで構造のあるデータをシンプルにする
- 14-3-1 JSONとは
- 14-3-2 JacksonでJSONを扱う
- 14-3-3 JSONデータを解析する
- 14-3-4 JSONデータを生成する
14-4 Loggerでアプリケーションのログを保存する
- 14-4-1 ログとレベル
- 14-4-2 SLF4J+Logbackでロギングをおこなう
- 14-4-3 SLF4J+Logbackの基本的な使い方
- 14-4-4 ファイルに出力する
- 14-4-5 変数を出力する
- 14-4-6 パッケージごとに出力ログレベルを変更する
- 14-4-7 動的に設定を変更する
プロフィール
谷本心
トラブルシューティングおよびプラットフォーム開発に従事。
その一方でJavaのコミュニティ活動をおこなっており,関西Javaエンジニアの立ち上げや,日本Javaユーザーグループ(JJUG)の幹事を務めるほか,サンフランシスコで開催されたJavaOne 2013,2015にてトラブルシュートについて講演。
好きなJava APIは,javax.management。
阪本雄一郎
BCIを用いたJavaのコア部分の操作から,SpringBootを用いたWebシステムの開発,Hadoop/Sparkを用いたリアルタイムレコメンドシステム開発まで,幅広い開発経験を持ち,とにかく何でもこなす。
最近では,IoT基盤プラットフォーム開発のプロジェクトリーダを務める。
好きなJava APIは,java.nio。
岡田拓也
開発マネジメントや,OSSプロダクトの調査/検証を経験。
技術者としての仕事の傍ら,10年以上に渡って,母校の東工大にて大学生を対象にした無料Javaセミナーを開催。ITエンジニアの裾野を広げるべく,活動してきた。
2014年からは,ミャンマー支社のAcroquest Myanmar Technologyにて,技術指導や支社運営に従事。現地のエンジニアが最新技術を勉強できる土壌を作るべく,コミュニティを立ち上げようと奮闘している。
好きなJava APIは,java.time。
秋葉誠
Javaによるミッションクリティカルな集中監視システムのフレームワーク開発から,データベース,ネットワークなどに触れて,インフラ方面に興味を持つようになる。
現在は,環境構築から運用,DevOpsに向けて「開発もできるインフラエンジニア」を目指して活動している。
好きなJava APIは,javax.sql。
村田賢一郎
Javaによるミッションクリティカルな集中監視システムのフレームワーク開発,システム開発に長らく携わる。興味の中心は非同期処理,メッセージング。
最近では自然言語処理を活用したプロジェクトのマネジメントをしており,自然言語処理の実案件での活用にのめり込んでいる。
好きなJava APIは,java.util.concurrent。
Acroquest Technology株式会社
1991年3月創業。プラットフォームとしてUNIXをいち早く採用した集中監視制御システムの開発を中心に,ミッションクリティカルな分野で事業を展開。早期からJava/オブジェクト指向を開発現場に本格導入。2004年からはシステムダウン,メモリリークなどのシステム障害を根本解決するJava障害解決サービス「Java Troubleshooting Service」を提供しており,2017年1月現在すべての障害を解決している。
大規模システム開発や,Java Troubleshooting Service以外にも,2016年4月にはリアルタイムでの検索・分析・可視化を提供するオランダのElasticsearch株式会社とOEMパートナー契約を締結し,データ活用のニーズに対応する事業を展開。
Elastic製品の代理販売・導入コンサルティングや,Elastic製品を基盤としたデータ分析・可視化をおこなう次のような製品を提供している。
- IoTプラットフォーム「AcroMUSASHI Torrentio」
- データ分析からビジネス改善を促進する「ENdoSnipe BVM」
- ユーザー体験を可視化する「ENdoSnipe UXM」
- アプリケーションパフォーマンス管理をする「ENdoSnipe APM」
また,人を大切にする経営学会による「日本でいちばん大切にしたい会社大賞」の審査委員会特別賞を受賞。