Javaによるプログラミングに関する世界観3(クラスライブラリ)です。
Javaのクラスライブラリは、ほとんどのプログラミングに必要なクラスやメソッド(関数)を網羅しており、「完成されている」ことで有名です。
java.lang.Objectから階層的な「ツリー構造のクラスライブラリ」を形成しており、継承とインターフェースの実装で作られています。
ほとんどのクラスがインスタンスのオブジェクトをnewして作ることで使用可能なほか、すでにあるクラスを自ら継承して、派生クラスとして自分独自の機能を追加した新しいクラスを作ることもできます。
一度Javaのクラスライブラリを覚えると、他の言語のライブラリなどは覚える必要が無く、Java SE/EE/MEなどのスケーラブルなエンタープライズ機能やサブセットにも応用でき、プログラミングを行う上で「何でもできるリベラルな基本」を知ることができます。プログラミングを行う上で、先だって必要な「基礎の能力」が身に付くでしょう。
公式のマニュアル。Javaはとても完成されたクラスライブラリ(関数やデータ構造などの設計図であると同時に利用の仕組みである、クラスのライブラリ)があります。
Microsoftの同様の技術として、.NET FrameworkとC#/VB.NETがあります。
Javaには3つのエディションがある。
エディション | 解説 |
---|---|
Java SE | 通常のJava。 |
Java EE | サーバー向けのJava。サーブレットのような機能を含む。 |
Java ME | 組み込み・モバイルなどに向けたJavaのサブセット。Java SEの機能の一部は実装しない。 |
エディションごとにJDK(開発キット)とJRE(実行環境)がある。
パッケージ。Javaではさまざまなパッケージをimport文で読み込んで使うことができる。特に、標準クラスライブラリにはたくさんのJavaクラスが含まれている。Javaはこのクラスライブラリがとても汎用的で優れているために利用されることが多い。
java.ioパッケージをインポートするには、以下のように記述する。
import java.io.*;
java.langパッケージは何も記述しなくても自動的にインポートされる。すなわち、以下は自動的に宣言される。
import java.lang.*;
また、自分の書いたクラスをパッケージの一部にしたい場合は、以下のように記述する。
package hoge;
主なパッケージの一覧は、以下の書籍やページなどに掲載されています。
javax.*パッケージは拡張機能。拡張機能は、Java SEのJDK(開発キット)やJRE(実行環境)には含まれない。
java.lang.refは、弱参照。強参照(通常の参照)ではGCの回収の対象にならないオブジェクトも、弱参照ならGCの回収の対象になる。
Java(ガーベッジコレクションと例外)も参照のこと。
java.lang.reflectは、リフレクション。クラスやメソッドの情報をプログラム内から取得したり、文字列変数などから動的にメソッドを実行できる。
リフレクションとevalも参照のこと。
java.util.prefsは、プリファレンス。データを設定ファイルに読み書きできる。
Javaクラスライブラリ(XML)も参照のこと。
java.rmiとjavax.rmiは、RMI。ネットワーク上にあるJavaのメソッドを参照して実行できる。
JavaBeansも参照のこと。
その他、それぞれのパッケージについての解説は以下が参考になります。
java.lang.Objectは、全てのクラスの基盤となるクラス。すべてのクラスはObject型を継承している。
Javaのクラスライブラリは、美しく機能的に設計されており、機能をそのまま使うだけでもとても便利です。
ですが、時によっては、標準の機能では足りなかったり、「こんな機能やデータへのアクセス方法があればいいな」と思うこともあります。
そのような時には、Javaのオブジェクト指向の「継承」を使って、機能を付け加えることができます。
Javaのクラスライブラリは、多くがpublicクラスとして公開されており、継承ができます。いわば、最初からプログラマが自分で機能を拡張したりすることを見越して設計されていると言えます。
Javaプログラミングは、もちろん最初からクラス設計をしてすべてのコードを書く場合もありますが、このように、既にあるクラスを流用して、機能を付け加える形で目的のプログラム機能を実装することも多くあります。
つまり、Javaのクラスライブラリは、プログラム機能やデータ型として使うことも一般的ですが、それ以上に、「既にあるJava資産を自分で強化していく」ために作られています。
Javaはこのように、最初からオープンかつ柔軟な設計をしています。そのため、Javaはオープンソースとも親和性が高いです。かつて、長らくJava自身はオープンソースではありませんでしたが、OpenJDKによってオープンソースになりました。またかつてのApache Jakartaのように、サーバーサイドJavaでは多くのコンポーネントがオープンソースで提供されていました。「Javaとオープンは密接な仲にある」と言えます。
後日注記:GUIアプリケーションの開発では、「コンポーネントの作成」ということをよく行います。僕も昔Delphiで少しだけ触ったことがありますが、DelphiやC#/VB.NETやGTKなどのアプリケーションでは、独自のGUIコントロールやウィジェットを作るために、既にあるクラスを継承してコンポーネントを作成します。そのため、Javaと同様に、クラスライブラリを継承して独自のクラスを作るという手法は、ほかの言語でも、特にGUI開発系の言語でよく見られます。
Javaの真に偉大な点は、優れたクラスライブラリを作った点であると思います。
はっきり言って、プログラミング言語という存在が占める範囲は、本当は言語機能よりもモジュールやライブラリが大きな領域を占めるのではないかと思います。
Pythonがこれだけ普及したのは、言語機能よりも、優れたモジュールやライブラリがあるということが大きいです。
よく考えると、PHPやRubyのようなほかの言語であっても、ほとんどはライブラリです。ライブラリのAPIリファレンスを覚えることこそが、言語の習得において真に必要です。
そのような中で、Javaがなぜ偉大かと言えば、それは優れたクラスライブラリを作った、ということにあるでしょう。
Javaのクラスライブラリは美しく、またScalaやKotlinやClojureのようなJava VMで動くほかの言語から、そのライブラリ資産を使うことができます。
また、Javaの基本となるクラスライブラリAPIを覚えてしまえば、Swingやサーブレットなどの応用分野であっても、同じライブラリAPIを使うことができます。
そして、Javaの強力なオブジェクト指向の機能である「継承」を使うことで、このライブラリは使うだけではなく、自ら機能を付け足すための「プログラムの土台」にもなってくれるのです。
またJava VMは別のCPUアーキテクチャでも仮想マシン上で同じプログラムが動くため、同じAPIでさまざまなJava VMの動くアーキテクチャに対応できます。主にモバイル向けに、移植性の高いプログラミング環境を得ることができます。
SmalltalkやSqueakがオブジェクト指向の「環境」であったように、Javaもまたそのような「環境」であると言えます。その環境は、Java VMとクラスライブラリが支えているのです。