NullPointerExceptionの万能薬ではなく、Java 8の新しいオプションクラス

Java 8リリースでは、開発者がNullPointerException処理するのに役立つ新しいOptionalクラスが導入されています。

多くの場合、多くの場合、 NullPointerException 。この非常に不快な例外は、コードのデバッグを強制します。これにより、前任者の1人(およびおそらくあなた)がnull悪名高いチェックを行わなかった場所を把握できnull

しかし、クラスの特定のフィールドにnull割り当てることが禁止されている場合はどうでしょうか? Javaは当然、これを行うことを禁じていませんが、 Optionalするともう少し便利で視覚的になります。

そのため、このイノベーションの主な特徴について説明し始めます。

オプションのオブジェクトの作成

始めるために、 Optionalを使用してサンプルクラスを提供します。

 import java.util.Date; import java.util.Optional; public class Person { private Optional<String> firstName; private Optional<String> secondName; private Optional<Integer> age; private Optional<PersonAddress> address; public Optional<String> getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = Optional.ofNullable(firstName); } public Optional<String> getSecondName() { return secondName; } public void setSecondName(String secondName) { this.secondName = Optional.of(secondName); } public Optional<Integer> getAge() { return age; } public void setAge(Integer age) { this.age = Optional.ofNullable(age); } public Optional<PersonAddress> getAddress() { return address; } public void setAddress(PersonAddress address) { this.address = Optional.of(address); } } 

ご覧のとおり、「set」メソッドを介して値のクラスのフィールドを設定する場合、 Optional - of(), ofNullable()) class Optional - of(), ofNullable())の静的メソッドを使用します。

これらのメソッドは、タイプがOptionalオブジェクトを作成するために使用されます;以下は、そのような作成オブジェクトの例です:

 /**  Optional  */ // Optional  Optional<Person> optionalPerson = Optional.empty(); //Optional     Optional<Person> optionalNonNull = Optional.of(somePerson); //Optional      Optional<Person> optionalNullable = Optional.ofNullable(somePerson); 

オプションを使用して冗長コードを排除する

転送されたオブジェクトだけでなく、オブジェクトのフィールド(テキストの説明など)が含まれているオブジェクトのフィールドで作業する必要がある場合、さまざまなメソッドで送信または処理されるnullオブジェクトのチェックには多くのコード行が必要です。

オブジェクトのチェーンを介してこのフィールドに直接アクセスしようとして、何らかの理由で送信されたオブジェクトがnullNullPointerExceptionNullPointerExceptionするため、最初に各オブジェクトのnullをチェックし、必要なテキストフィールドのみを取得する必要があります。

 Person person = getDefaultPerson(); if (person != null) { PersonAddress personAddress = person.getAddress(); if (personAddress != null) { PersonAddressStreet street = personAddress.getStreet(); if(street != null) { streetName = street.getStreetName(); } else { streetName = "EMPTY"; } } } 

そして今、すべてが同じですが、 Optionalを使用しています:

 String streetName = person.flatMap(Person::getAddress) .flatMap(PersonAddress::getStreet) .map(PersonAddressStreet::getStreetName) .orElse("EMPTY"); 

もっと簡潔になりましたね。

ifPresent()メソッドを使用したオブジェクトのアクション

ifPresent()メソッドは、次の形式のコードの冗長性も排除します。

  if(person != null) { System.out.println(person); } 

同じアクションですが、 Optionalを使用します:

 person.ifPresent(System.out::println); 

isPresent()を使用したオブジェクトのアクション

isPresent()は、コードの冗長性を排除する上で大きな利点を与えませんが、記述されたコードにもう少し情報を与えます。

以前のように:

 if(person != null) { System.out.println(person) } else { System.out.println("Person not found!"); } 

同じですが、 Optionalを使用します:

 if (person.isPresent()) { System.out.println(person.get()); } else { System.out.println("Person not found!"); } 

orElse()またはorElseThrow()を使用したオブジェクトのアクション

そして最後に、コードの「美しさ」を指摘するためのいくつかの方法があります。

以前のように:

 Person personNew = person != null ? person : new Person(); 

同じですが、 Optionalを使用します:

 Person personNew = person.orElse(new Person()); 

または、オブジェクトを作成したくない場合は、例外をスローできます。

 Person personNewThrow = person.orElseThrow(Exception::new); 

おわりに

Naturally Optionalは、 NullPointerExceptionを取り除く保証を与えず、すべてのnullチェックを前に説明できますが、 Optionalを使用すると、オブジェクトをチェックしたりチェックしたりする追加のメソッドや、オブジェクトを使用したいくつかのアクションが既に記述されているため、これらのアクションはより速く簡単になりますコードで使用するだけです。

また、もちろん、 Optionalはコードにより多くの情報を提供し、コードを読みやすくするのに役立ちます。

これで、この革新についての短い説明を終わります。読んでくれてありがとう! このトピックの詳細については、以下のリンクをご覧ください。

さらなる研究のための情報:

Source: https://habr.com/ru/post/J225641/


All Articles