1概要


https://commons.apache.org/proper/commons-lang/


は、Java API

の機能を拡張することを目的とした、普及しているフル機能のユーティリティクラスのパッケージです。

ライブラリのレパートリーはかなり豊富で、文字列、配列と数の操作、リフレクションと並行処理から、ペアやトリプル(一般的にhttps://en.wikipedia.org/wiki/Tupleとして知られている)のようないくつかの順序付けられたデータ構造の実装にまで及びます。[タプル])。

このチュートリアルでは、ライブラリの最も有用なユーティリティクラスについて詳しく説明します。


2 Mavenの依存関係

いつもどおり、Apache Commons Lang 3を使い始めるには、まずhttps://search.maven.org/search?q=g:org.apache.commons%20AND%20a:commons-lang3を追加する必要があります。

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.8</version>
</dependency>


3

StringUtils

クラス

この紹介のまとめで取り上げる最初のユーティリティクラスは__https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/StringUtils.html[StringUtils]です。

その名前が示すように、


StringUtils

を使用すると、


https://docs.oracle.com/javase/7/docs/api/java/lang/Stringを補完または拡張する、一連のnullセーフなs


trings

__操作を実行できます。 html[java.lang.String]

は箱から出して

を提供しています。


string

が空白、空、小文字、大文字、英数字などであるかどうかを判断するなど、特定の

string

に対していくつかのチェックを実行する一連のユーティリティメソッドを紹介しましょう。

@Test
public void whenCalledisBlank__thenCorrect() {
    assertThat(StringUtils.isBlank(" ")).isTrue();
}

@Test
public void whenCalledisEmpty__thenCorrect() {
    assertThat(StringUtils.isEmpty("")).isTrue();
}

@Test
public void whenCalledisAllLowerCase__thenCorrect() {
    assertThat(StringUtils.isAllLowerCase("abd")).isTrue();
}

@Test
public void whenCalledisAllUpperCase__thenCorrect() {
    assertThat(StringUtils.isAllUpperCase("ABC")).isTrue();
}

@Test
public void whenCalledisMixedCase__thenCorrect() {
    assertThat(StringUtils.isMixedCase("abC")).isTrue();
}

@Test
public void whenCalledisAlpha__thenCorrect() {
    assertThat(StringUtils.isAlpha("abc")).isTrue();
}

@Test
public void whenCalledisAlphanumeric__thenCorrect() {
    assertThat(StringUtils.isAlphanumeric("abc123")).isTrue();
}

もちろん、

StringUtils

クラスは他の多くのメソッドを実装していますが、ここでは簡単のために省略しています。

特定のタイプの変換アルゴリズムを特定の

string

にチェックまたは適用するその他の方法については、https://www.baeldung.com/string-processing-commons-lang[このチュートリアルをチェック]をご覧ください。

上記で取り上げたものは本当に簡単なので、単体テストは一目瞭然です。


4

ArrayUtils

クラス



  • ArrayUtils


    クラスは、次のような一連のユーティリティメソッドを実装します。さまざまな形や形の配列を処理してチェックすることができます** 。

toString()メソッドのオーバーロードされた2つの実装から始めましょう。これは、指定された

array



string

表現と、

array

がnullの場合は特定の

string

を返します。

@Test
public void whenCalledtoString__thenCorrect() {
    String[]array = {"a", "b", "c"};
    assertThat(ArrayUtils.toString(array))
      .isEqualTo("{a,b,c}");
}

@Test
public void whenCalledtoStringIfArrayisNull__thenCorrect() {
    assertThat(ArrayUtils.toString(null, "Array is null"))
      .isEqualTo("Array is null");
}

次に、

hasCode()

メソッドと

toMap()

メソッドがあります。

前者は

arrayのカスタムhttps://www.baeldung.com/java-hashcode[hashCode]実装を生成し、後者は

array



httpsに変換します。/api/java/util/Map.html[Map]__:

@Test
public void whenCalledhashCode__thenCorrect() {
    String[]array = {"a", "b", "c"};
    assertThat(ArrayUtils.hashCode(array))
      .isEqualTo(997619);
}

@Test
public void whenCalledtoMap__thenCorrect() {
    String[][]array = {{"1", "one", }, {"2", "two", }, {"3", "three"}};
    Map map = new HashMap();
    map.put("1", "one");
    map.put("2", "two");
    map.put("3", "three");
    assertThat(ArrayUtils.toMap(array))
      .isEqualTo(map);
}

最後に、

isSameLength()

メソッドと

indexOf()

メソッドを見てみましょう。

前者は2つの配列が同じ長さかどうかをチェックするために使われ、後者は与えられた要素のインデックスを得るために使われます。

@Test
public void whenCalledisSameLength__thenCorrect() {
    int[]array1 = {1, 2, 3};
    int[]array2 = {1, 2, 3};
    assertThat(ArrayUtils.isSameLength(array1, array2))
      .isTrue();
}

@Test
public void whenCalledIndexOf__thenCorrect() {
    int[]array = {1, 2, 3};
    assertThat(ArrayUtils.indexOf(array, 1, 0))
      .isEqualTo(0);
}


StringUtils

クラスと同様に、

ArrayUtils

はさらに多くの追加メソッドを実装します。あなたはhttps://www.baeldung.com/array-processing-commons-lang[このチュートリアル]でそれらについてもっと学ぶことができます。

この場合は、最も代表的なものだけを紹介しました。


5

NumberUtils

クラス

Apache Commons Lang 3のもう1つの主要コンポーネントはhttps://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/math/NumberUtils.html[NumberUtils]クラスです。

予想通り、このクラスは、数値型の処理と操作を目的とした多数のユーティリティメソッドを提供しています。


int



long

など、さまざまなプリミティブの同等性を比較する

compare()

メソッドのオーバーロード実装を見てみましょう。

@Test
public void whenCalledcompareWithIntegers__thenCorrect() {
    assertThat(NumberUtils.compare(1, 1))
      .isEqualTo(0);
}

@Test
public void whenCalledcompareWithLongs__thenCorrect() {
    assertThat(NumberUtils.compare(1L, 1L))
      .isEqualTo(0);
}

さらに、

byte



short

を操作する

compare()

の実装も存在します。

このレビューの次は

createNumber()



isDigit()

メソッドです。

最初のものは

string

の数値表現を作成することを可能にし、2番目のものは

string

が数字のみで構成されているかどうかをチェックします。

@Test
public void whenCalledcreateNumber__thenCorrect() {
    assertThat(NumberUtils.createNumber("123456"))
      .isEqualTo(123456);
}

@Test
public void whenCalledisDigits__thenCorrect() {
    assertThat(NumberUtils.isDigits("123456")).isTrue();
}

提供された配列のmix値とmax値を見つけることになると、

NumberUtils

クラスは、

min()

メソッドと

max()

メソッドのオーバーロードされた実装を通じて、これらの操作を強力にサポートします。

@Test
public void whenCalledmaxwithIntegerArray__thenCorrect() {
    int[]array = {1, 2, 3, 4, 5, 6};
    assertThat(NumberUtils.max(array))
      .isEqualTo(6);
}

@Test
public void whenCalledminwithIntegerArray__thenCorrect() {
    int[]array = {1, 2, 3, 4, 5, 6};
    assertThat(NumberUtils.min(array)).isEqualTo(1);
}

@Test
public void whenCalledminwithByteArray__thenCorrect() {
    byte[]array = {1, 2, 3, 4, 5, 6};
    assertThat(NumberUtils.min(array))
      .isEqualTo((byte) 1);
}


6.


分数クラス

ペンと紙を使うとき、分数を使って作業することはすべてうまくいきます。しかし、コードを書くとき、このプロセスの複雑さを経験する必要がありますか?あんまり。



  • Fraction


    クラスは、微分で分数の加算、減算、乗算を行います

@Test
public void whenCalledgetFraction__thenCorrect() {
    assertThat(Fraction.getFraction(5, 6)).isInstanceOf(Fraction.class);
}

@Test
public void givenTwoFractionInstances__whenCalledadd__thenCorrect() {
    Fraction fraction1 = Fraction.getFraction(1, 4);
    Fraction fraction2 = Fraction.getFraction(3, 4);
    assertThat(fraction1.add(fraction2).toString()).isEqualTo("1/1");
}

@Test
public void givenTwoFractionInstances__whenCalledsubstract__thenCorrect() {
    Fraction fraction1 = Fraction.getFraction(3, 4);
    Fraction fraction2 = Fraction.getFraction(1, 4);
    assertThat(fraction1.subtract(fraction2).toString()).isEqualTo("1/2");
}

@Test
public void givenTwoFractionInstances__whenCalledmultiply__thenCorrect() {
    Fraction fraction1 = Fraction.getFraction(3, 4);
    Fraction fraction2 = Fraction.getFraction(1, 4);
    assertThat(fraction1.multiplyBy(fraction2).toString()).isEqualTo("3/16");
}

分数を使った演算は、日々の開発作業で取り組むべき最も頻繁なタスクではありませんが、

Fraction

クラスはこれらの演算を簡単な方法で実行するための貴重なサポートを提供します。


7.

SystemUtils

クラス

場合によっては、基盤となるJavaプラットフォームやオペレーティングシステムのさまざまなプロパティや変数に関する動的な情報を取得する必要があります。

  • Apache Commons Lang 3は、これを簡単な方法で実現するための__https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/SystemUtils.html[SystemUtils]クラスを提供します。

たとえば、

getJavaHome()



getUserHome()

、および

isJavaVersionAtLeast()

メソッドを考えてみましょう。

@Test
public void whenCalledgetJavaHome__thenCorrect() {
    assertThat(SystemUtils.getJavaHome())
      .isEqualTo(new File("path/to/java/jdk"));
}

@Test
public void whenCalledgetUserHome__thenCorrect() {
    assertThat(SystemUtils.getUserHome())
      .isEqualTo(new File("path/to/user/home"));
}

@Test
public void whenCalledisJavaVersionAtLeast__thenCorrect() {
    assertThat(SystemUtils.isJavaVersionAtLeast(JavaVersion.JAVA__RECENT)).isTrue();
}


SystemUtils

クラスが実装する追加のユーティリティーメソッドがいくつかあります。例を短くするためにそれらを省略しました。


8遅延初期化クラスとビルダークラス

  • Apache Commons Lang 3の最も魅力的な側面の1つは、https://en.wikipedia.org/wiki/Lazy

    initialization[lazy-initialization]およびhttps://en.wikipediaを含む、いくつかの有名なデザインパターンの実装です。 org/wiki/Builder

    pattern[ビルダー]パターン** 。

たとえば、高価な

User

クラス(簡潔にするために示されていません)を作成し、そのインスタンス化を本当に必要になるまで延期したいとしましょう。

そのような場合は、パラメータ化されたhttps://commons.apache.org/proper/commons-lang/apidocs/index.html?org/apache/commons/lang3/concurrent/LazyInitializerを拡張するだけです。 html[LazyInitializer]抽象クラスを作成し、その

initialize()

メソッドをオーバーライドします。

public class UserInitializer extends LazyInitializer<User> {

    @Override
    protected User initialize() {
        return new User("John", "[email protected]");
    }
}

それでは、必要なときに高価な

User

オブジェクトを取得したい場合は、__UserInitializerのget()メソッドを呼び出すだけです。

@Test
public void whenCalledget__thenCorrect()
  throws ConcurrentException {
    UserInitializer userInitializer = new UserInitializer();
    assertThat(userInitializer.get()).isInstanceOf(User.class);
}

private volatile User instance;

User get() {
    if (instance == null) {
        synchronized(this) {
            if (instance == null)
                instance = new User("John", "[email protected]");
            }
        }
    }
    return instance;
}

さらに、Apache Commons Lang 3はhttps://commons.apache.org/proper/commons-lang/javadocs/api-3.1/org/apache/commons/lang3/builder/HashCodeBuilder.html[HashCodeBuilder]クラスを実装しています。典型的な流暢なAPIに基づいて、ビルダーにさまざまなパラメーターを提供することで

hashCode()

実装を生成することができます。

@Test
public void whenCalledtoHashCode__thenCorrect() {
    int hashcode = new HashCodeBuilder(17, 37)
      .append("John")
      .append("[email protected]")
      .toHashCode();
    assertThat(hashcode).isEqualTo(1269178828);
}



BasicThreadFactory


クラスと同様のことができ、デーモンを作成できます。命名パターンと優先順位を持つスレッド

@Test
public void whenCalledBuilder__thenCorrect() {
    BasicThreadFactory factory = new BasicThreadFactory.Builder()
      .namingPattern("workerthread-%d")
      .daemon(true)
      .priority(Thread.MAX__PRIORITY)
      .build();
    assertThat(factory).isInstanceOf(BasicThreadFactory.class);
}


9

ConstructorUtils

クラス

ReflectionはApache Commons Lang 3の第一級の市民です。

このライブラリにはいくつかのリフレクションクラスが含まれているため、クラスフィールドとメソッドにリフレクティブにアクセスして操作できます。

たとえば、単純な

User

ドメインクラスを実装したとしましょう。

public class User {

    private String name;
    private String email;

   //standard constructors/getters/setters/toString
}

そのパラメータ化されたコンストラクタが

public

であると仮定すると、我々は__httpsを使ってそれに簡単にアクセスすることができます:クラス:

@Test
public void whenCalledgetAccessibleConstructor__thenCorrect() {
    assertThat(ConstructorUtils
      .getAccessibleConstructor(User.class, String.class, String.class))
      .isInstanceOf(Constructor.class);
}

コンストラクタを介した標準的なクラスのインスタンス化の代わりに、単に

invokeConstructor()

メソッドと

invokeExactConstructor()

メソッドを呼び出すことで、

User

インスタンスを反射的に作成することができます。

@Test
public void whenCalledinvokeConstructor__thenCorrect()
  throws Exception {
      assertThat(ConstructorUtils.invokeConstructor(User.class, "name", "email"))
        .isInstanceOf(User.class);
}

@Test
public void whenCalledinvokeExactConstructor__thenCorrect()
  throws Exception {
      String[]args = {"name", "email"};
      Class[]parameterTypes= {String.class, String.class};
      assertThat(ConstructorUtils.invokeExactConstructor(User.class, args, parameterTypes))
        .isInstanceOf(User.class);
}


10

FieldUtils

クラス

同様に、

読み書きするためにhttps://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/reflect/FieldUtils.html[

FieldUtils

]クラスのメソッドを使用できますクラスフィールド


User

クラスのフィールド、または最終的にクラスがスーパークラスから継承しているフィールドを取得したいとしましょう。

そのような場合、

getField()

メソッドを呼び出すことができます。

@Test
public void whenCalledgetField__thenCorrect() {
    assertThat(FieldUtils.getField(User.class, "name", true).getName())
      .isEqualTo("name");
}

あるいは、もっと制限的なリフレクションスコープを使用し、

User

クラスで宣言され、スーパークラスから継承されていないフィールドのみを取得したい場合は、単に

getDeclaredField()

メソッドを使用します。

@Test
public void whenCalledgetDeclaredFieldForceAccess__thenCorrect() {
    assertThat(FieldUtils.getDeclaredField(User.class, "name", true).getName())
      .isEqualTo("name");
}

さらに、反映されたクラスのフィールド数を取得するために

getAllFields()

メソッドを使用し、

writeField()

および

writeDeclaredField()

を使用して宣言されたフィールドまたは階層内で定義されたフィールドに値を書き込むことができます。メソッド:

@Test
public void whenCalledgetAllFields__thenCorrect() {
    assertThat(FieldUtils.getAllFields(User.class).length)
      .isEqualTo(2);
}

@Test
public void whenCalledwriteField__thenCorrect()
  throws IllegalAccessException {
    FieldUtils.writeField(user, "name", "Julie", true);
    assertThat(FieldUtils.readField(user, "name", true))
      .isEqualTo("Julie");
}

@Test
public void givenFieldUtilsClass__whenCalledwriteDeclaredField__thenCorrect() throws IllegalAccessException {
    FieldUtils.writeDeclaredField(user, "name", "Julie", true);
    assertThat(FieldUtils.readField(user, "name", true))
      .isEqualTo("Julie");
}


11

MethodUtils

クラス

同様に、


MethodUtils


クラスを使用して、クラスメソッドにリフレクションを使用できます。 。

この場合、

User

クラスの

getName()

メソッドの可視性は

public

です。そのため、

getAccessibleMethod()

メソッドでアクセスできます。

@Test
public void whenCalledgetAccessibleMethod__thenCorrect() {
    assertThat(MethodUtils.getAccessibleMethod(User.class, "getName"))
      .isInstanceOf(Method.class);
}

リフレクティブにメソッドを呼び出す場合は、

invokeExactMethod()

メソッドと

invokeMethod()

メソッドを使用できます。

@Test
public
  void whenCalledinvokeExactMethod__thenCorrect()
  throws Exception {
    assertThat(MethodUtils.invokeExactMethod(new User("John", "[email protected]"), "getName"))
     .isEqualTo("John");
}

@Test
public void whenCalledinvokeMethod__thenCorrect()
  throws Exception {
    User user = new User("John", "[email protected]");
    Object method = MethodUtils.invokeMethod(user, true, "setName", "John");
    assertThat(user.getName()).isEqualTo("John");
}


12.

MutableObject

クラス


  • immutability

    は、あらゆるオブジェクトを扱う場合にデフォルトで使用される、優れたオブジェクト指向ソフトウェアの重要な機能ですが** 、残念ながら、可変オブジェクトを扱う必要があります。

さらに、可変クラスを作成するには、自動生成されたセッターを介してほとんどのIDEで生成できる定型コードが多数必要です。

そのために、Apache Commons Lang 3は


MutableObject


クラスを提供します最小限の手間で可変オブジェクトを作成するための単純なラッパークラスです。

@BeforeClass
public static void setUpMutableObject() {
    mutableObject = new MutableObject("Initial value");
}

@Test
public void whenCalledgetValue__thenCorrect() {
    assertThat(mutableObject.getValue()).isInstanceOf(String.class);
}

@Test
public void whenCalledsetValue__thenCorrect() {
    mutableObject.setValue("Another value");
    assertThat(mutableObject.getValue()).isEqualTo("Another value");
}

@Test
public void whenCalledtoString__thenCorrect() {
    assertThat(mutableObject.toString()).isEqualTo("Another value");
}

もちろん、これは

MutableObject

クラスの使い方のほんの一例です。

経験則として、常に不変クラスを作成するように努力する必要があります。最悪の場合、必要なレベルの可変性のみを提供するようにしてください。


13.

MutablePair

クラス

興味深いことに、Apache Commons Lang 3は、ペアとトリプルの形でタプルを強力にサポートしています。

それでは、順序付け可能な要素の可変ペアを作成する必要があるとしましょう。

その場合は、


MutablePair


クラスを使用します。

private static MutablePair<String, String> mutablePair;

@BeforeClass
public static void setUpMutablePairInstance() {
    mutablePair = new MutablePair<>("leftElement", "rightElement");
}

@Test
public void whenCalledgetLeft__thenCorrect() {
    assertThat(mutablePair.getLeft()).isEqualTo("leftElement");
}

@Test
public void whenCalledgetRight__thenCorrect() {
    assertThat(mutablePair.getRight()).isEqualTo("rightElement");
}

@Test
public void whenCalledsetLeft__thenCorrect() {
    mutablePair.setLeft("newLeftElement");
    assertThat(mutablePair.getLeft()).isEqualTo("newLeftElement");
}

ここで強調する価値がある最も関連性の高い詳細は、クラスのクリーンなAPIです。

それは私達が標準のセッター/ゲッターを通してペアによって包まれた左右のオブジェクトを設定してアクセスすることを可能にします。


14.

ImmutablePair

クラス

驚くことではないが、


https://commons.apache.org/proper/commons-lang/javadocs/api-3.1/org/apache/commons/lang3/tuple/ImmutablePair.htmlという、


MutablePair

クラスの不変の対応する実装もあります不変ペア]

:

private static ImmutablePair<String, String> immutablePair = new ImmutablePair<>("leftElement", "rightElement");

@Test
public void whenCalledgetLeft__thenCorrect() {
    assertThat(immutablePair.getLeft()).isEqualTo("leftElement");
}

@Test
public void whenCalledgetRight__thenCorrect() {
    assertThat(immutablePair.getRight()).isEqualTo("rightElement");
}

@Test
public void whenCalledof__thenCorrect() {
    assertThat(ImmutablePair.of("leftElement", "rightElement"))
      .isInstanceOf(ImmutablePair.class);
}

@Test(expected = UnsupportedOperationException.class)
public void whenCalledSetValue__thenThrowUnsupportedOperationException() {
    immutablePair.setValue("newValue");
}

不変クラスから期待できるように、

setValue()

メソッドを通してペアの内部状態を変更しようとすると、

UnsupportedOperationException

例外がスローされます。

15.


Triple

クラス

ここで見る最後のユーティリティクラスは__https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/tuple/Triple.htmlです。

クラスは抽象クラスなので、https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/tuple/Triple.html#of-LMR-を使って

Triple

インスタンスを作成できます。[

of()

]静的ファクトリメソッド:

@BeforeClass
public static void setUpTripleInstance() {
    triple = Triple.of("leftElement", "middleElement", "rightElement");
}

@Test
public void whenCalledgetLeft__thenCorrect() {
    assertThat(triple.getLeft()).isEqualTo("leftElement");
}

@Test
public void whenCalledgetMiddle__thenCorrect() {
    assertThat(triple.getMiddle()).isEqualTo("middleElement");
}

@Test
public void whenCalledgetRight__thenCorrect() {
    assertThat(triple.getRight()).isEqualTo("rightElement");
}



MutableTriple


およびを通じて、可変と不変の両方のトリプルの具体的な実装もあります。


ImmutableTriple


クラス。

静的ファクトリメソッドではなく、パラメータ化されたコンストラクタを介してインスタンスを作成できます。

この場合は、それらのAPIが

MutablePair

クラスおよび

ImmutablePair

クラスのAPIと非常によく似ているため、それらをスキップします。


16. 結論

  • このチュートリアルでは、Apache Commons Lang 3が提供する最も有用なユーティリティクラスのいくつかを詳しく調べました** 。

このライブラリには、他にも検討する価値のあるユーティリティクラスが多数実装されています。

フルライブラリAPIについては、https://commons.apache.org/proper/commons-lang/javadocs/api-release/index.html[公式のJavadocs]を確認してください。

いつもどおり、このチュートリアルに示されているすべてのコードサンプルはhttps://github.com/eugenp/tutorials/tree/master/libraries-apache-commons[GitHub]から入手できます。