问题描述
我有一个场景,请看看
句子可以是:
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,则形成的句子将是
“我上学无效 。” 或(动词为空 )。
“ 我去学校”(动词为空 )。
所以,请在回答之前考虑这个场景。
1楼
我更喜欢使用构建器模式,使最终用户的使用更清晰,并避免错误
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();
}
}
2楼
首先检查字段是否为空,并根据该信息创建一个句子:
if (s.getSubject != null)
{
//do something
}
if (s.getVerb != null)
{
//do something
}
etc.
3楼
根据您的评论,您不需要格式错误的句子。 也就是说,没有主语和动词的句子。
因此,您可以修改构造函数以获取subject
和verb
,如果其中任何一个为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;
}
这样,没有subject
或verb
就无法创建subject
。
4楼
在Java中 ,没有方便的方法可以做到这一点,你需要它的选项,使用getOrElse
来获取默认值。在Scala中,它有类做这件事。
我认为你可以在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");
}
}