Think Twice
IT技術メモ | Javaのメモ
Created: 2018-06-18 / Updated: 2022-11-06

Javaでenumを使ってシングルトンを素早く実装する


当メモは2018-06-18に投稿されたものを加筆修正し、再掲したものです。

目次


概要

昔はInitialize-On-Demand Holderとかを使っていましたが、
最近はenumでサクっとシングルトンは作ってしまっています。
以下に文字列ユーティリティクラスの例を載せておきます。

実装例

基本的には、唯一の要素であるINSTANCEを持つようなenumを作成して、あとはpublicメソッドを普通に作成していくだけです。
簡単だし楽ですね。

StringUtility.java
Copy
package jp.fumokmm;

import java.util.Objects;

public enum StringUtility {
    INSTANCE;

    /**
     * <p>指定の文字列をトリムします。
     * 指定の文字列がnullの場合は空文字が返却されます。</p>
     * @param str トリムする文字列
     * @return トリム後の文字列
     */
    public String trim(String str) {
        return Objects.nonNull(str) ? str.trim() : "";
    }

    /**
     * <p>指定の文字列をトリム(全角スペース含む)します。
     * 指定の文字列がnullの場合は空文字が返却されます。</p>
     * @param str トリムする文字列
     * @return トリム後の文字列
     */
    public String trimFull(String str) {
        if (Objects.isNull(str)) return "";
        int len = str.length();
        int st = 0;
        char[] val = str.toCharArray();
        while (st < len && (val[st] <= ' ' || val[st] == ' ')) {
            st++;
        }
        while (st < len && (val[len - 1] <= ' ' || val[len - 1] == ' ')) {
            len--;
        }
        return (st > 0 || len < str.length()) ? str.substring(st, len) : str;
    }

}

利用例

StringUtilityTest.java
Copy
package jp.fumokmm;

import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.*;

import org.junit.Test;

public class StringUtilityTest {

    @Test
    public void testTrim() {
        StringUtility util = StringUtility.INSTANCE;
        assertThat(util.trim(null), is(""));
        assertThat(util.trim(" "), is(""));
        assertThat(util.trim(" a "), is("a"));
        assertThat("全角スペース入りはトリムされない", util.trim("  a  "), is("  a  "));
    }

    @Test
    public void testTrimFull() {
        StringUtility util = StringUtility.INSTANCE;
        assertThat(util.trimFull(null), is(""));
        assertThat(util.trimFull(" "), is(""));
        assertThat(util.trimFull(" a "), is("a"));
        assertThat("全角スペース入りもトリムされる", util.trimFull("  a  "), is("a"));
    }

}

ちなみ

ちなみに上記テストでは、

Copy
StringUtility util = StringUtility.INSTANCE;
のように一度変数に代入してから使っていますが

Copy
StringUtility.INSTANCE.trim(str);
のようにそのまま使うも良しです。
可読性を見極めてご利用下さい。


参考

元記事

関連メモ