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比我的更详尽。