带有可选字段的Java对象

时间:2015-07-17 16:06:58

标签: java

我有一个场景,请看看

句子可以是:

  

String Subject + String Verb + String Object

     

String Subject + String Verb + String Adverb + String Object

     

String Subject + String Verb + String Adjective + String Object

     

String Subject + String Verb

我想创建一个Sentence类对象。

  Sentence s = new Sentence();
    s.setSubject();
    ...

现在,我可以将所有字段保留在Sentence类中,但是我想确保没有字段必须为null。     我想从我初始化的字段中创建任何类型的句子。

eg: 
Sentence s = new Sentence();
s.setSubject();
s.setVerb();
s.setObject();
s.getValue(); // will return sentence value as S+V+O as I have set SVO

Sentence s = new Sentence();
s.setSubject();
s.setVerb();
s.getValue(); // will return sentence value as S+V as I have set SV

依旧......我可以在java中做这样的事情。

基本上,我想避免使用未初始化的字段和nullpointers。

修改

请注意,如果我将字段留空,即“”或null,则形成的句子将类似

“我 null 到学校。”或(动词 null )。

“我上午学校”(动词为空)。

因此,请在回答之前考虑这个情况。

4 个答案:

答案 0 :(得分:3)

我更喜欢使用构建器模式,让最终用户更清楚地使用并避免错误

    Public class Sentence {

        private String subject;
        private String verb;
        private String adjective;
        private String object;

    //package private to ensure no one can call it outside package, canbe made pvt as well
        Sentence(String subject, String verb, String adjective, String object) {
            this.subject = subject;
            this.verb = verb;
            this.adjective = adjective;
            this.object = object;
        }

        public static class SentenceBuilder{
            private String subject;
            private String verb;
            private String adjective;
            private String object;

            private static final String EMPTY = "";

            private String sanitizeInput(String input){
                if (input==null){
                    return EMPTY;
                }
                return input;
            }

            private String validateInput(String input){
                if(input==null || input.isEmpty()){
                    throw new IllegalArgumentException("cant be null or empty"); 
                }
                return input;
            }

            public SentenceBuilder(String subject, String verb) {
                this.subject = validateInput(subject);
                this.verb = validateInput(verb);
            }

            public SentenceBuilder adjective(String adjective){
                this.adjective = sanitizeInput(adjective);
                return this;
            }

            public SentenceBuilder object(String object){
                this.object = sanitizeInput(object);
                return this;
            }

            public Sentence build(){
                return new Sentence(subject,verb,adjective,object);
            }
        }

        public static void main(String[] args) {
//sample usage            
Sentence sentence = new SentenceBuilder("subject","verb")
                    .adjective("adjective")
                    .object("object")
                    .build();
        }
    }

答案 1 :(得分:0)

首先检查字段是否为空,并根据该信息创建一个句子:

if (s.getSubject != null)
 {
  //do something
 }
if (s.getVerb != null)
 {
  //do something
 }

etc.

答案 2 :(得分:0)

根据您的评论,您不需要格式错误的句子。也就是说,没有主语和动词的句子。

因此,您可以修改构造函数以获取subjectverb并抛出IllegalArgumentException,如果其中任何一个是nullempty

public Sentence(String subject, String verb) {
    if (subject == null || subject.isEmpty()) {
         throw new IllegalArgumentException("No Subject?");
    }
    // Same as above for verb.

    this.subject = subject;
    this.verb = verb;
}

这样,如果没有subjectverb,就无法创建对象。

答案 3 :(得分:0)

Java 中,没有方便的方法可以做到这一点,您需要它的选项,使用getOrElse来获取默认值。在Scala中,它有Option类做这件事。

我认为你可以在Java中使用HashMap来做这件事。

public class Test {
    HashMap<String, String> data = new HashMap<>();

    public void setSubject(String subject) {
        data.put("subject", subject);
    }

    public void getSubject() {
        data.getOrDefault("subject", "your_default_value");
    }

    public void setVerb(String verb) {
        data.put("verb", verb);
    }

    public void getVerb() {
        data.getOrDefault("verb", "your_default_value");
    }

    public void setObject(String object) {
        data.put("object", object);
    }

    public void getObject() {
        data.getOrDefault("object", "your_default_value");
    }
}