はじめに
こんにちは。
スッキリわかるJava入門 実践編の学習を進めています。
この学習記録を備忘録として残しながら、自身の理解を深めたいと思っています。
今回は第3部「効率的な開発の実現」/ 第10章「基本的な開発ツール」について学びました。
JDKには、ドキュメント生成・コンパイル・アーカイブ作成・実行などを行う基本ツールが標準で添付されています。
さらに、AntやMavenを使うとビルド工程を自動化でき、開発効率を大きく高められます。
この記事が、同じくJavaの学習をしている人にとっても参考になりましたら幸いです。
参考書籍について
- 書籍名:スッキリわかるJava入門 実践編
- 著者:中山清喬
- 出版社:インプレス
目次
目次
1. 本章の要点
Javaが備える基本ツール
JDKには、開発に必要な基本ツールが標準で含まれています。
本格的な開発では、これらのツールを使って最低限の開発効率を確保することが重要です。
JDK
JDK(Java Development Kit)は、Javaプログラムの開発に必要なツール一式です。
コンパイラ(javac)、実行環境(java)、ドキュメント生成(javadoc)などが含まれています。
javadoc - 仕様書の自動生成
javadocは、Javadocコメントを解釈してプログラムの仕様書(HTML)を自動生成するツールです。
/**
* ヒーローを表すクラスです。
*/
public class Hero {
/**
* ヒーローに攻撃を行います。
*
* @param enemy 攻撃対象の名前
*/
public void attack(String enemy) {
System.out.println(enemy + "に攻撃した");
}
}
javadoc -d docs -encoding UTF-8 -charset UTF-8 Hero.java
# docsフォルダにHTML形式の仕様書が生成される
javac - コンパイル
javacは、Javaのソースコード(.java)をバイトコード(.class)に変換するコマンドです。
アノテーションを解釈しながらコンパイルを行います。
javac Hero.java
# Hero.class が生成される
jar - アーカイブの操作
jarコマンドは、クラスファイルやプロパティファイルを1つのアーカイブファイル(JAR)にまとめるツールです。
# Hero.classをまとめてgame.jarを作成
jar cvf game.jar Hero.class
# 出力例:
# added manifest
# adding: Hero.class(in = 512) (out= 320)(deflated 37%)
java - JVMの起動と実行
javaコマンドは、JVMを起動してバイトコードを実行するコマンドです。
JVMはバイトコードをマシン語に変換しながらプログラムを動かします。
java Hero
ヒープとスタック
JVMのメモリ領域には、主にヒープとスタックがあります。
- スタック:メソッドの呼び出しや、ローカル変数を管理する領域
- ヒープ:インスタンスを格納する領域
ガベージコレクション
ガベージコレクション(GC)は、ヒープ上の不要になったインスタンスを自動的に解放するしくみです。
ヒープ不足を防ぐためにJVM内で動作しますが、GCの動作中は処理性能が低下し、発生タイミングを制御することは基本的にできません。
メモリリークに注意
GCがあってもメモリリークは起こります。不要になったはずのインスタンスが、どこからか参照され続けると解放されないためです。
import java.util.ArrayList;
import java.util.List;
public class LeakExample {
// staticなリストは終了まで参照され続けるため、要素が解放されない
private static final List<byte[]> cache = new ArrayList<>();
public static void main(String[] args) {
for (int i = 0; i < 1000; i++) {
cache.add(new byte[1024 * 1024]); // 1MBずつ追加し続ける
}
System.out.println("キャッシュの件数:" + cache.size());
}
}
// 出力:
// キャッシュの件数:1000
メモリリークを防ぐポイント
不要になったオブジェクトへの参照を残さないようにします。下記は例えです。
- ローカル変数を使い、スコープを狭くする:変数の有効範囲を最小限にすると、メソッド終了後に参照が消える
-
リスナーやコールバックは登録解除する:
removeListener()などで、不要になったら登録を外す - キャッシュには上限を設ける:件数や有効期限を決め、古いものから捨てる(WeakHashMapなども選択肢)
jshell - Javaの対話的実行
jshellは、Javaの文を1行ずつ対話的に実行できるツールです。
動作確認や文法の試行に便利です。
jshell
jshell> int x = 3 * 4
x ==> 12
jshell> System.out.println("x = " + x)
x = 12
統合開発環境
統合開発環境(IDE)は、エディタ、コンパイル、実行、デバッグなどを1つにまとめた開発ツールです。
IntelliJ IDEAやEclipseなどが代表的です。コマンドラインのツールを個別に使うより、効率的に開発できます。
Ant
Antは、XML形式のビルドファイル(build.xml)でコンパイルやJAR作成などの工程を自動化するツールです。
<project name="game" default="build">
<target name="build">
<javac srcdir="src" destdir="bin"/>
<jar destfile="game.jar" basedir="bin"/>
</target>
</project>
Maven
Mavenは、pom.xmlに必要な情報を記述し、標準のフォルダ構成に従って実行することでビルドを自動化するツールです。
pom.xmlに依存関係を明示すると、必要なライブラリをMavenが自動的にダウンロードします。
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>game</artifactId>
<version>1.0</version>
<dependencies>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
</dependency>
</dependencies>
</project>
mvn package
# target/game-1.0.jar が生成される
2. 自分なりの解釈
- 開発ツールを手作業で使うより、AntやMavenでビルドを自動化するほうが、ミスが減り効率的だと感じました。
- ガベージコレクションがあってもメモリリークは起こるため、不要な参照を残さない意識が大切だとわかりました。
最後まで見ていただきありがとうございました。
次回は、第3部 / 第11章「単体テストとアサーション」について書く予定です。