我有一个场景,请看看
句子可以是:
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 )。
“我上午学校”(动词为空)。
因此,请在回答之前考虑这个情况。
答案 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)
根据您的评论,您不需要格式错误的句子。也就是说,没有主语和动词的句子。
因此,您可以修改构造函数以获取subject
和verb
并抛出IllegalArgumentException
,如果其中任何一个是null
或empty
。
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;
}
这样,如果没有subject
或verb
,就无法创建对象。
答案 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");
}
}