Java 验证由另一个参数确定的construcor参数
我有以下Java 验证由另一个参数确定的construcor参数,java,oop,parameters,constructor,Java,Oop,Parameters,Constructor,我有以下enum public enum StudentType { Domestic, International; } 以及具有以下构造函数的学生类: //Left out additonal parameters and validation public Student(StudentType type, List<String> documents){ if(type == null){ throw new IllegalArgumentExcep
enum
public enum StudentType {
Domestic, International;
}
以及具有以下构造函数的学生类:
//Left out additonal parameters and validation
public Student(StudentType type, List<String> documents){
if(type == null){
throw new IllegalArgumentException("You must provide Student type");
}
this.type = type;
this.documents = this.validateList(documents);
}
private Student(StudentType type, List<String> documents) {
this.type = type;
this.documents = documents;
}
public static Student createDomestic() {
return new Student(StudentType.DOMESTIC), Collections.emptyList());
}
public static Student createInternational(List<Document> documents) {
return new Student(StudentType.INTERNATIONAL, new ArrayList<>(documents);
}
//省略了附加参数和验证
公立学生(StudentType,列表文档){
if(type==null){
抛出新的IllegalArgumentException(“您必须提供学生类型”);
}
this.type=type;
this.documents=this.validateList(文档);
}
以及验证列表的专用方法:
private List<String> validateList(List<String> validate){
if(this.type == StudentType.Domestic && validate.isEmpty()){
return validate;
}
else
if(this.type == StudentType.Domestic && !validate.isEmpty()){
return Collections.emptyList();
}
return new ArrayList<String>(validate);
}
私有列表验证列表(列表验证){
if(this.type==StudentType.hominal&&validate.isEmpty()){
返回验证;
}
其他的
if(this.type==StudentType.hominal&&!validate.isEmpty()){
返回集合。emptyList();
}
返回新的ArrayList(验证);
}
我的计划是让学生的课堂一成不变
说明:
只有国际学生才需要证件(护照等)。国内学生不需要任何文件
在我的构造函数中
我检查以确保类型不是null
,客户必须提供国内或国际
在我的私有validateList方法中,我检查学生类型,以及列表是否为空。如果是内部的且为空,则返回列表;如果是domensitc且不为空,则返回空集合,否则返回文档的ArrayList
我的问题是,检查私有方法中的类型是否为代码气味?我担心的是,一个参数(文档列表)由学生类型决定/验证。如果检查私有方法中的类型是代码气味,我应该怎么做 我看到您发布的代码存在一些问题,但不是您认为它存在的问题
首先,我们不知道文档
来自哪里。我假设这只是代码中的一个错误,实际上是第二个参数
现在,代码:
private List<String> validateList(List<String> validate){
if(this.type == StudentType.Domestic && validate.isEmpty()){
return validate;
}
else
if(this.type == StudentType.Domestic && !validate.isEmpty()){
return Collections.emptyList();
}
return new ArrayList<String>(validate);
}
最后,(回到我的第一点),由于如果学生类型为“国内”,则调用方不应传递非空列表,因此可以使用两个工厂方法而不是构造函数来实现这一点:
//Left out additonal parameters and validation
public Student(StudentType type, List<String> documents){
if(type == null){
throw new IllegalArgumentException("You must provide Student type");
}
this.type = type;
this.documents = this.validateList(documents);
}
private Student(StudentType type, List<String> documents) {
this.type = type;
this.documents = documents;
}
public static Student createDomestic() {
return new Student(StudentType.DOMESTIC), Collections.emptyList());
}
public static Student createInternational(List<Document> documents) {
return new Student(StudentType.INTERNATIONAL, new ArrayList<>(documents);
}
private Student(StudentType,列表文档){
this.type=type;
本文件=文件;
}
公共静态学生(国内){
返回新学生(StudentType.national)、Collections.emptyList());
}
公共静态学生国际(列表文档){
返回新学生(StudentType.INTERNATIONAL)、新ArrayList(文档);
}
我将以以下方式重写validateList
方法:
private List<String> validateList(List<String> validate){
if(this.type == StudentType.Domestic){
return Collections.emptyList();
}
return new ArrayList<String>(validate);
}
私有列表验证列表(列表验证){
if(this.type==StudentType.national){
返回集合。emptyList();
}
返回新的ArrayList(验证);
}
解释
只要你只需要在学生类型为国内的情况下不返回任何文档,我就将两个条件合并为一个条件。国内学生是否有文档对我们来说并不重要,我们不需要检查这一点。我更正了我的代码,文档应该是构造函数参数。如果学生是国内的,t如果不需要任何类型的文档,列表集合应该是空的。如果我只想使用构造函数,而不使用工厂方法,我该怎么做呢?正如我所说,如果列表应该是空的,但不是空的,我会抛出一个异常。你也可以提供一个没有文档的重载构造函数。但是为什么不能使用工厂方法?这是一个任意的限制。我可以使用工厂方法,只是出于好奇,想知道没有工厂方法是否可以。你的答案和上面的答案都非常好。如果我能投票支持这个,我会(新帐户),就像我以前写的那样。对我来说,如果客户端首先传递一个空列表,忽略它并返回一个新的空列表似乎有点奇怪。谢谢。这个想法是为了让代码尽可能简单。使用return Collections.emptyList();你清楚地表明了你的意图,不管怎样,但是当一个学生在家时,他应该没有文档。是的,保留初始数组以防它是空的效率不高。但是我更喜欢易读性和简单性,而不是细微的性能改进。我想这是Java世界的一种常见做法。无论如何,我更喜欢的不是answer比我的更详尽。