「第2言語として始めるJava」

4冊目はJava

2015年3月31日に、4冊目の電子書籍「第2言語として始めるJava」をAmazonで出版しました。300円です。

本書のスタイルは「Clojure Essentials」と似ており、Javaの文法や基本機能を淡々と説明しています。最後にサンプルアプリも出てきますが解説は淡白です。Java8のラムダやストリームもカバーしています(Java8が執筆のmotivatorでした)。

関数型プログラミングの基礎知識については、最初の書籍や、「関数型プログラミング概論」でも解説しています。

表紙

jacket

コーヒーカップは、InkScapeというソフトで描きました。ドロー系ソフトをちゃんと使ったのは初めてでしたが、便利ですね~。

「はじめに」より抜粋

本書は、既に何らかのプログラミング言語をマスターしている人がJavaを習得するためのガイドブックです。2014年に公開されたJava8では、比較的大きな仕様変更や機能追加が行われました。しかし公開から1年以上経過した現在でも、Javaプログラマの間にJava8は十分に浸透していません(私見ですが)。これからJavaを学ぶ人にとっては、既存のJavaプログラマを追い越す絶好のチャンスと言えるでしょう。

本書では、「変数とは何か」や「条件分岐の使い方」といった、初級プログラマ向けのトピックには触れません。またオブジェクト指向プログラミングの知識を前提とします。例えばC++、C#、Ruby、VisualBasicのどれかを使える人なら、苦もなく読みこなせるでしょう。PHP、Perl、JavaScriptなどの使い手でも、(クラスベースの)オブジェクト指向の基本概念を理解していれば大丈夫だと思います。

もくじ

第1部

  • 背景知識
  • データ
  • パッケージ
  • 開発と実行
  • 最初のプログラム
  • クラス
  • インターフェイス
  • ジェネリクス
  • その他の型
  • 文と演算子
  • 例外とエラー処理
  • スレッド

第2部

  • Objectクラス
  • Stringクラス
  • コレクション
  • 日時
  • 入出力
  • 正規表現
  • システムプロパティ

第3部

  • 強化されたインターフェイス
  • ラムダ
  • メソッド参照
  • 関数インターフェイス
  • 関数型プログラミング
  • Stream
  • Optional
  • 新しい日時API
  • その他の強化点

第4部

  • mdpub: Markdown処理アプリ
  • Webアプリ準備
  • Webアプリ版mdpubw

書き忘れ

1つ書き忘れました。多重継承を許すオブジェクト指向言語には、系列の違う複数の親が持つ同名の(厳密に言えば同じシグニチャの)メソッドをどう呼び分けるか、という問題が付きまといます。これまでのJavaはこの問題とは縁が無かった(多重継承を認めないので)のですが、Java8ではインターフェイスがメソッドのボディ部を持てる(defaultメソッドやstaticメソッド)ようになったので、この問題が生じます。

interface IA {
  default void foo() {}
  static void bar() {}
  void methodA();
}

interface IB {
  default void foo() {}
  static void bar() {}
  void methodB();
}

IAとIBの両方を実装したクラスを定義し、その中でfoo()やbar()を呼ぶときは、以下のように書きます。

class Both implements IA, IB {
  void methodA() {
    IA.super.foo();
    IA.bar();
  }
  void methodB() {
    IB.super.foo();
    IB.bar();
  }
}

正誤表

例外のログ出しにバグ

mdpubのMarkdownPublisherクラスで、例外のスタックトレースをログに出すコードがバグってました。

try {
    ...
} catch (IOException | UncheckedIOException e) {
    Logger logger = LogManager.getLogger();
    StringWriter sw = new StringWriter();
    e.printStackTrace(new PrintWriter(sw));
    logger.fatal(sw.toString());
    throw new AppException("an IOException: "
            + e.getMessage());
}

JSPにリンクを埋め込む

mdpubwのindex.jspにリンクを埋め込むときに、リクエストのgetContextPath()メソッドでパスを取得していたのですが、これだと、リクエストがプロクシ(apacheとか)経由で来る場合にうまくいきません。素直にカレントからの相対で指定した方が良さそうです。

<li><a href="coverpage?key=${initParam.jslKey}">${initParam.jslTitle}</a></li>
Last modified:2015/04/09 19:31:07
Keyword(s):
References:[言語Tips]
This page is frozen.