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



オブジェクトのチェックには多くのコード行が必要です。



オブジェクトのチェーンを介してこのフィールドに直接アクセスしようとして、何らかの理由で送信されたオブジェクトがnull



NullPointerException



NullPointerException



するため、最初に各オブジェクトの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



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



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



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






All Articles