繁体   English   中英

带有可选字段的Java对象

[英]Java Object with optional fields

我有一个场景,请看看

句子可以是:

String Subject + String Verb + String Object

String Subject + String Verb + String Adverb + String Object

String主题+字符串动词+字符串形容词+字符串对象

字符串主题+字符串动词

我想创建一个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,则形成的句子将是

“我上学无效 。” 或(动词为 )。

我去学校”(动词为 )。

所以,请在回答之前考虑这个场景。

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

    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();
        }
    }

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

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

etc.

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

因此,您可以修改构造函数以获取subjectverb ,如果其中任何一个为null或为empty ,则抛出IllegalArgumentException

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就无法创建subject

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");
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM