【Guava】StandardSystemPropertyの使い方

Javaでシステムプロパティを取得する際には、System.getProperty("キー") を直接呼び出すのが一般的です。しかし、この方法ではキー名を文字列でハードコードする必要があるため、スペルミスや定数の重複、可読性の低下といった問題が起こりがちです。

こうした課題を解決する手段として、Googleが提供するライブラリ GuavaStandardSystemProperty を活用すれば、列挙型(enum)による安全かつ明示的なアクセスが可能になります。IDEの補完も活用できるため、開発効率や保守性の向上にもつながります。

この記事では、StandardSystemProperty の基本的な使い方から利点、注意点、実務での活用法までを詳しく解説します。

目次

StandardSystemPropertyとは?

StandardSystemProperty は、Google Guavaライブラリの com.google.common.base パッケージに含まれる 列挙型(enum)クラス で、Javaが標準で提供するシステムプロパティを網羅的に定義しています。

通常、システムプロパティを取得するには System.getProperty("java.version") のように キーを文字列で直接指定する必要がありますが、この方法ではミスや保守性の問題が発生しやすくなります。

一方で StandardSystemProperty を使えば、以下のように 定数としてプロパティに安全にアクセスできます。

StandardSystemProperty.JAVA_VERSION.value();

このように、プロパティ名を 定義済みのenum定数で表現できるため、可読性が向上し、IDEの補完機能も活用できる点が大きなメリットです。

定義されているプロパティ一覧

StandardSystemProperty には、Javaが標準で定義しているシステムプロパティが列挙型として登録されています。これらはすべて System.getProperty で取得可能なプロパティであり、Javaの実行環境やOS情報などを取得する際に便利です

以下は定義されている定数とその対応するプロパティ名、および説明の一覧です。

Enum定数対応プロパティ名説明
JAVA_VERSIONjava.versionJavaのバージョン
JAVA_VENDORjava.vendorJavaのベンダ名
JAVA_VENDOR_URLjava.vendor.urlJavaベンダの公式URL
JAVA_HOMEjava.homeJavaのインストールパス
JAVA_VM_SPECIFICATION_VERSIONjava.vm.specification.versionJVM仕様のバージョン
JAVA_VM_SPECIFICATION_VENDORjava.vm.specification.vendorJVM仕様のベンダ名
JAVA_VM_SPECIFICATION_NAMEjava.vm.specification.nameJVM仕様の名称
JAVA_VM_VERSIONjava.vm.versionJVM実装のバージョン
JAVA_VM_VENDORjava.vm.vendorJVM実装のベンダ名
JAVA_VM_NAMEjava.vm.nameJVM実装の名称
JAVA_SPECIFICATION_VERSIONjava.specification.versionJava仕様のバージョン
JAVA_SPECIFICATION_VENDORjava.specification.vendorJava仕様のベンダ名
JAVA_SPECIFICATION_NAMEjava.specification.name”Java仕様の名称
JAVA_CLASS_VERSIONjava.class.versionクラスファイルのバージョン
JAVA_CLASS_PATHjava.class.pathクラスパス
JAVA_LIBRARY_PATHjava.library.pathネイティブライブラリの検索パス
JAVA_IO_TMPDIRjava.io.tmpdir一時ファイル用ディレクトリのパス
JAVA_COMPILERjava.compiler使用するJITコンパイラ名
JAVA_EXT_DIRSjava.ext.dirs拡張ディレクトリ(※Java 9以降は使用不可)
OS_NAMEos.nameOSの名称
OS_ARCHos.archOSのアーキテクチャ
OS_VERSIONos.versionOSのバージョン
FILE_SEPARATORfile.separatorファイルパスの区切り文字
PATH_SEPARATORpath.separator複数パスの区切り文字
LINE_SEPARATORline.separator改行コード
USER_NAMEuser.name実行ユーザ名
USER_HOMEuser.homeユーザのホームディレクトリ
USER_DIRuser.dir実行時のカレントディレクトリ

すべての定数には以下のメソッドが用意されています。

  • key():プロパティ名(文字列)を返す
  • value():対応するシステムプロパティの値を返す(null の可能性あり)

実際の使い方

StandardSystemProperty は、Javaの標準システムプロパティに対して簡潔かつ安全にアクセスするための手段です。ここでは、基本的な使い方から応用的な利用例までを紹介します。

単一のプロパティを取得する例

特定のシステムプロパティを取得したい場合は、以下のように value() メソッドを使います。

import com.google.common.base.StandardSystemProperty;

public class Example {
    public static void main(String[] args) {
        String javaVersion = StandardSystemProperty.JAVA_VERSION.value();
        System.out.println("Java Version: " + javaVersion);
    }
}

出力例:

Java Version: 11.0.21

このように、プロパティキーをハードコードせず、列挙型定数として安全にアクセスできます。

すべてのプロパティを出力する例

StandardSystemProperty.values() を使えば、定義されている全プロパティをループ処理で一括出力できます。ログ出力や環境確認などに便利です。

for (StandardSystemProperty prop : StandardSystemProperty.values()) {
    System.out.printf("%s = %s%n", prop.key(), prop.value());
}

出力例(一部):

java.version = 11.0.21
java.vendor = Eclipse Adoptium
java.vendor.url = https://adoptium.net/
java.home = C:\Program Files\Eclipse Adoptium\jdk-11.0.21.9-hotspot

System.getPropertyとの違い

Java標準の System.getProperty(String key) は、任意のシステムプロパティを取得できる柔軟なAPIですが、キーを文字列で直接指定するため、いくつかの落とし穴があります。

一方で StandardSystemProperty を使えば、列挙型によってキーが定義済みになっているため、ミスを防ぎ、安全にアクセスできるという利点があります。

以下は、それぞれの違いを観点ごとに比較した表です。

比較項目System.getProperty()StandardSystemProperty
型安全性❌ 文字列ベース。スペルミスがコンパイル時に検出されない✅ Enum定数のため安全
保守性❌ ハードコードになりやすく、修正漏れのリスクあり✅ プロパティ名が定数化されており、意図が明確
補完機能❌ IDEの補完が効かず、キー名を都度調べる必要がある✅ IDE補完が効き、一覧から選択できる
柔軟性✅ 任意のキーが指定可能(カスタムプロパティ含む)❌ Java標準のプロパティのみ対応

どちらを使うべきか?

  • 標準プロパティ(JavaのバージョンやOS情報など)を扱う場合は、StandardSystemProperty を使うことで可読性・安全性が大幅に向上します。
  • 独自プロパティや外部ライブラリの設定値など、定義されていないキーを扱う場合は、従来の System.getProperty() を使う必要があります。

使用上の注意点とベストプラクティス

StandardSystemProperty は非常に便利な仕組みですが、使う際にはいくつか注意すべきポイントがあります。安全に活用するためのコツとあわせて紹介します。

value()null を返すことがある

内部的には System.getProperty(key()) を呼び出しているため、プロパティが存在しない場合は null が返されます。
そのため、必ず null チェックを行うことが重要です。

String osName = StandardSystemProperty.OS_NAME.value();
if (osName != null) {
    System.out.println("OS: " + osName);
} else {
    System.out.println("OS情報は取得できませんでした。");
}

特に環境依存のプロパティ(例:JAVA_COMPILERJAVA_EXT_DIRS)は、環境によっては設定されていないことがあります。

独自プロパティ(カスタムキー)は対象外

StandardSystemProperty はあくまで Javaの標準プロパティのみを対象としているため、アプリケーション固有のプロパティ(例:app.env.modeconfig.path)などには対応していません。

そのようなケースでは、従来通り System.getProperty("app.env.mode") を使用しましょう。

実務での活用例

以下のような場面で StandardSystemProperty は特に有効です。

  • 実行ログに環境情報を出力
    Javaのバージョン、OSの種類、ユーザー名などをログ出力しておくことで、障害調査がスムーズになります。
  • テスト環境の違いを可視化
    プロパティの一覧を出力することで、ローカルとCI環境の差異を明確にできます。
  • ユーザーサポートの診断情報として活用
    システム構成を確認する際に、標準プロパティを取得するコードを埋め込むと便利です。

まとめ:StandardSystemPropertyで安全かつ効率的なプロパティアクセスを実現

StandardSystemProperty は、Google Guavaが提供する列挙型クラスで、Javaの標準システムプロパティに対して安全かつ簡潔にアクセスする手段を提供してくれます。

従来の System.getProperty("キー") のようなハードコードによるミスや可読性の低下を防ぎ、IDE補完や型安全性といったモダンな開発環境に適した使い方が可能になります。

特に以下のようなケースでは導入効果が高いです:

  • プロパティアクセスを定数化して保守性を高めたい場合
  • ログや診断出力で実行環境の情報を収集したい場合
  • チーム全体で統一的なコーディングスタイルを目指したい場合

すでに Guava を導入しているプロジェクトであれば、今すぐにでも使い始められる軽量なユーティリティです。
システムプロパティにアクセスする処理があるなら、ぜひ StandardSystemProperty の利用を検討してみてください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次