Guava可选择使用多个对象和字段

时间:2017-03-11 14:51:35

标签: java guava

我的课程很少:

    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

在创建Person对象之后,我需要从一些字段构建描述(使用StringBuilder),例如:personName,personSurname,taskDescription,docDescription和documentAuthorDescription。事情是我必须检查一些对象/字段的nullables(我不想在描述中存储空值)。在这一刻,我这样做:

    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 Optionals来做到这一点。特别是当我检查空的女巫时。所以请给我一些建议并原谅我糟糕的坏英语:)

1 个答案:

答案 0 :(得分:0)

不要担心解决问题的“最酷”方式,而是关注“最干净”,“最安全”和“最容易维护”的解决方案。

处理null肯定容易出错,导致countless bugs,但它们是Java语言的一部分,有时候它们就是你需要的。

特别是,在API边界公开Optional(例如作为公共方法的返回类型)通常更有意义,而不是返回可能为空的值。这样,您的呼叫者就可以放心,安全地使用您的代码,而不必担心意外的NPE。不过,使用null或其他一些概念表示缺席,您的私人实施可能会更好。

根据经验,Optional应该使您的代码更安全,更易于使用。如果你发现自己跳过篮球以使事情Optional退后一步并考虑其他方法。