2017-03-11 3 views
1

私はいくつかのクラスがあります:PERSONNAME、personSurname、taskDescription、docDescriptionと:グァバオプション

public class Person { 
     private String personName; 
     private String personSurname; 
     private int age; 
     private Task task; 
     private Document document; 
    //getters and setters 

    public class Task { 
     private long taskNumber; 
     private String taskDescription; 
     private String taskPriority; 
    //get&set 

    public class Document { 
     private String docName; 
     private String docDescription; 
     private long docNumber; 
     private String docType; 
     private DocumentAuthor documentAuthor; 
    // get&set 

    public class DocumentAuthor { 
     private String documentAuthorName; 
     private long documentAuthorNumber; 
     private String documentAuthorDescription; 
    // get&set 

とした後、私のようないくつかのフィールドから(のStringBuilderとの)説明を構築する必要がPersonオブジェクトを作成しますdocumentAuthorDescription。問題は、いくつかのオブジェクト/フィールドのヌル値をチェックする必要があるときです(私は説明にヌルを格納したくありません)。この時点で私はこのようにしています:

private static String setStringBuilder(Person person) { 
      StringBuilder sb = new StringBuilder(); 
      //create Optional objects for every class except Person: 
      Optional<Document> personDocument = Optional.fromNullable(person.getDocument()); 
      Optional<Task> personTask = Optional.fromNullable(person.getTask()); 
      Optional<DocumentAuthor> personDocumentAuthor = Optional.fromNullable(person.getDocument().getDocumentAuthor()); 
      //create List where i add fields for description 
      List<Optional<String>> list = new ArrayList(); 
      list.add(Optional.fromNullable(person.getPersonName())); 
      list.add(Optional.fromNullable(person.getPersonSurname())); 
      //in this section i check presents of objects: 
      if (personDocument.isPresent()) { 
       list.add(Optional.fromNullable(person.getDocument().getDocDescription())); 
       list.add(Optional.fromNullable(person.getDocument().getDocType())); 
      } 
      if (personTask.isPresent()) { 
       list.add(Optional.fromNullable(person.getTask().getTaskDescription())); 
      } 
      if (personDocumentAuthor.isPresent()) { 
       list.add(Optional.fromNullable(person.getDocument().getDocumentAuthor().getDocumentAuthorName())); 
      } 
      //here i build StringBuilder from fields stored in list 
      for (Optional<String> optional : list) { 
       if (optional.isPresent()) { 
        sb.append(optional.get()); 
        sb.append(" "); 
       } 
      } 
      String description = sb.toString(); 
      return description; 
     } 

しかし、私はGuava Optionalalsでこれを行うための最もクールな方法があると信じています。特に私はヌルの魔女を確認すると。だからplsは私にいくつかのアドバイスを与えて、私の悪い悪い英語を許してください:)

+0

これは実際にはnullよりもきれいになることはありません。 –

+0

私はOptionalsで何もできませんか? – Transell

+0

このタスクではありません。 –

答えて

0

問題を解決する "クールな"方法を心配しないで、代わりに "最もクリーンな"、 "最も安全な"と "ソリューションを維持する。

nullを扱うのは確かにエラーが起こりやすく、countless bugsが原因ですが、それらはJava言語の一部であり、時には必要なものです。

特に、可能性のあるnull値を返すのではなく、API境界(たとえばパブリックメソッドの戻り値の型)として公開する方が理にかなっています。これにより、予期しないNPEを心配することなく、発信者が自信を持って安全にコードを操作できるようになります。非公開の実装は、nullやその他の概念を使用して不在を表すだけでよい場合があります。

概算として、Optionalは、コードをより安全で使いやすくする必要があります。 Optionalを元に戻って別のアプローチを検討するために、自分自身がジャンプしている場合は、