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
はコードにより多くの情報を提供し、コードを読みやすくするのに役立ちます。
これで、この革新についての短い説明を終わります。読んでくれてありがとう! このトピックの詳細については、以下のリンクをご覧ください。
さらなる研究のための情報: