Java 8における堅牢なアプリケーション開発:Base64、Optional、Nashornの活用

Java標準ライブラリによるBase64処理

基本エンコードとデコード

java.util.Base64を利用することで、データの安全な送受信や保管が容易になります。getEncoder()で取得したエンコーダを用いてバイト配列をBase64文字列へ変換し、getDecoder()で元のバイト配列へ復元します。復元時に文字列化する際、エンコード前と同じ文字セットを指定することが重要です。

public static void main(String[] args) {
    String sourceText = "Java 8 Base64";

    String base64Result = Base64.getEncoder().encodeToString(sourceText.getBytes());
    System.out.println("エンコード結果: " + base64Result);

    byte[] decodedArr = Base64.getDecoder().decode(base64Result);
    String restoredText = new String(decodedArr);
    System.out.println("デコード結果: " + restoredText);
}

URLおよびファイル名に安全なエンコーダ

URLやファイル名にBase64文字列を含める場合、+/が問題を引き起こす可能性があります。このようなケースではgetUrlEncoder()を使用します。このエンコーダは+-に、/_に置換し、URLセーフな文字列を生成します。デコード時はgetUrlDecoder()を用います。

public static void main(String[] args) {
    String rawUrlData = "https://example.com/api?param=value";

    String urlSafeEncoded = Base64.getUrlEncoder().encodeToString(rawUrlData.getBytes(StandardCharsets.UTF_8));
    System.out.println("URLセーフ エンコード: " + urlSafeEncoded);

    byte[] restoredBytes = Base64.getUrlDecoder().decode(urlSafeEncoded);
    String finalUrlData = new String(restoredBytes, StandardCharsets.UTF_8);
    System.out.println("デコード結果: " + finalUrlData);
}

MIME対応Base64エンコード

メールなどMIME形式での送信を想定したエンコードではgetMimeEncoder()を使用します。出力は一定の行長ごとに改行(\r\n)が挿入されます。デコードにはgetMimeDecoder()を用います。

public static void main(String[] args) {
    String mimePayload = "This is a test string for MIME Base64 encoding in Java.";

    String mimeEncodedResult = Base64.getMimeEncoder().encodeToString(mimePayload.getBytes(StandardCharsets.UTF_8));
    System.out.println("MIME エンコード:\n" + mimeEncodedResult);

    byte[] mimeDecodedArr = Base64.getMimeDecoder().decode(mimeEncodedResult);
    String restoredMimeText = new String(mimeDecodedArr, StandardCharsets.UTF_8);
    System.out.println("デコード結果: " + restoredMimeText);
}

Null安全とOptional

java.util.Optionalは、値が存在しない可能性を明示的に表現するコンテナオブジェクトです。これにより、NullPointerExceptionの発生を防ぎ、より安全なコードを記述できます。

  • インスタンス生成: Optional.of()は非null値を、Optional.ofNullable()はnull許容値をラップします。
  • 値の確認と取得: isPresent()で値の有無を確認し、get()で値を取り出します。値が存在しない場合にget()を呼ぶと例外がスローされます。
  • デフォルト値の提供: orElse()で直接デフォルト値を指定するか、orElseGet()でSupplierを通じて遅延評価でデフォルト値を生成します。
  • 値の変換と検証: map()flatMap()で値を変換し、filter()で条件に合わない値を除外します。
  • 例外スロー: 値がない場合に例外を投げるにはorElseThrow()を使用します。
public static void main(String[] args) {
    Optional<String> optStr = Optional.of("Sample");
    Optional<String> emptyOpt = Optional.ofNullable(null);

    // 値の取得と確認
    if (optStr.isPresent()) {
        System.out.println("値が存在します: " + optStr.get());
    }

    // デフォルト値の扱い
    String val1 = emptyOpt.orElse("代替値");
    String val2 = emptyOpt.orElseGet(() -> "遅延生成された代替値");

    // 条件付き実行
    optStr.ifPresent(v -> System.out.println("存在する値: " + v));

    // フィルタリングとマッピング
    String filteredVal = optStr.filter(v -> v.startsWith("S")).orElse("該当なし");
    String mappedVal = optStr.map(String::toUpperCase).orElse("空です");

    // 例外のスロー
    try {
        emptyOpt.orElseThrow(() -> new IllegalStateException("値が必須です"));
    } catch (IllegalStateException e) {
        System.out.println("捕捉した例外: " + e.getMessage());
    }
}

NashornによるJavaScript実行環境

Java 8で導入されたNashornエンジンは、JVM上でJavaScriptを実行するための高性能なランタイムです。従来のRhinoエンジンに代わり、Javaとの相互運用性と実行速度が向上しています。

スクリプトの実行と変数連携

ScriptEngineを利用してJSコードを評価し、put()メソッドでJavaの変数をJavaScriptコンテキストに渡すことができます。

public static void main(String[] args) throws ScriptException {
    ScriptEngine jsEngine = new ScriptEngineManager().getEngineByName("nashorn");

    jsEngine.eval("print('Nashornへようこそ!')");

    jsEngine.put("user", "Tanaka");
    jsEngine.eval("print('こんにちは、' + user + 'さん!')");
}

Javaオブジェクトとの相互運用

JavaScript内からJavaのクラスをインスタンス化してメソッドを呼び出すことも可能です。

// Javaクラス定義
public class Employee {
    public String getId() {
        return "EMP-001";
    }
}

// スクリプト実行
ScriptEngine jsEngine = new ScriptEngineManager().getEngineByName("nashorn");
jsEngine.eval("var emp = new Employee(); print(emp.getId());");

また、Nashornには対話型シェルツールとしてjjsが用意されており、ターミナルから直接JavaScriptファイルを実行するのにも便利です。

$ jjs app.js

タグ: Java 8 Base64 Optional Nashorn

7月17日 01:12 投稿