Void Type in Java

Overview

Java 開発者として、Void 型に出会う機会があり、その目的は何だろうと思ったことがあるかもしれません。

このクイック チュートリアルでは、この奇妙なクラスについて学び、いつ、どのように使用するか、また、可能な限り使用しないようにする方法を確認します。 その目的は、単にクラスとして void 戻り値の型を表し、Class<Void> public value を含むことです。

したがって、Void 変数に代入できる唯一の値は null です。 少し役に立たないように見えるかもしれませんが、この型をいつ、どのように使用するかを見ていきます。

用途

Void型を使用すると面白い状況がいくつかあります。 Reflection

第一に、リフレクションを行うときに使うことができます。 実際、任意の void メソッドの戻り値は、前述の Class<Void> 値を保持する Void.TYPE 変数に一致します。

単純な Calculator クラスを想像してみましょう。 さて、結果を返さないすべてのメソッドをリフレクションによって取得する必要があるとします。

@Testvoid givenCalculator_whenGettingVoidMethodsByReflection_thenOnlyClearAndPrint() { Method calculatorMethods = Calculator.class.getDeclaredMethods(); List<Method> calculatorVoidMethods = Arrays.stream(calculatorMethods) .filter(method -> method.getReturnType().equals(Void.TYPE)) .collect(Collectors.toList()); assertThat(calculatorVoidMethods) .allMatch(method -> Arrays.asList("clear", "print").contains(method.getName()));}

見てわかるように、clear() と print() メソッドだけが取得されました。 Generics

Void型のもう1つの使用法は、ジェネリッククラスでの使用です。

public class Defer { public static <V> V defer(Callable<V> callable) throws Exception { return callable.call(); }}

しかし、私たちが渡したい Callable は何も返す必要がないメソッドを呼び出していると仮定します。 したがって、Callable<Void> を渡すことができます。

@Testvoid givenVoidCallable_whenDiffer_thenReturnNull() throws Exception { Callable<Void> callable = new Callable<Void>() { @Override public Void call() { System.out.println("Hello!"); return null; } }; assertThat(Defer.defer(callable)).isNull();}

ランダムな型 (Callable<Integer> など) と null または全く型を返さない (Callable) こともできましたが、Void を使用すると意図が明確に示されます。 実のところ、私たちの Callable はラムダとして書かれることができました。 Functionを必要とするメソッドがあり、何も返さないFunctionを使いたいとします。

public static <T, R> R defer(Function<T, R> function, T arg) { return function.apply(arg);}
@Testvoid givenVoidFunction_whenDiffer_thenReturnNull() { Function<String, Void> function = s -> { System.out.println("Hello " + s + "!"); return null; }; assertThat(Defer.defer(function, "World")).isNull();}

How to Avoid It Using? しかし、最初の使い方は全く問題ないとしても、可能であればジェネリックで Void を使用するのは避けたいと思うかもしれません。 実際、結果がないことを表し、null を含むことしかできない戻り値の型に遭遇すると、面倒なことになります。

では、これらの状況を回避する方法を説明します。 まず、Callable パラメータを持つメソッドについて考えてみましょう。 Callable<Void> を使用しないようにするために、代わりに Runnable パラメータを取る別のメソッドを提供することがあります。 その場合、Callable<Void> オプションに固執するか、Runnable を取る別のクラスを作成し、Defer クラスへの呼び出しを延期することができます。 この例では、Function は何も返さないので、代わりに Consumer を取る別のメソッドを提供できます。

public static <T> void defer(Consumer<T> consumer, T arg) { consumer.accept(arg);}

次に、関数がパラメータを取らない場合はどうでしょうか。 Runnable を使用するか、独自の関数インターフェイスを作成します (その方がわかりやすい場合):

public interface Action { void execute();}

次に、再び defer() メソッドをオーバーロードします:

public static void defer(Action action) { action.execute();}
Action action = () -> System.out.println("Hello!");Defer.defer(action);

結論

この短い記事で、Java Void クラスを取り上げました。 その目的は何であり、どのように使用するのかを見ました。

いつものように、この記事の全コードは GitHub で見ることができます。

Learn Spring コースで Spring 5 と Spring Boot 2 を始めましょう:

>> コースをチェックする

コメントを残す

メールアドレスが公開されることはありません。