Один из способов - написать приватные методы проверки c. Компактный способ их использования будет выглядеть следующим образом:
public MyClass(Person person, SomeEnum enum1) {
this.person = validatePerson(person);
this.enum1 = validateSomeEnum(enum1);
}
public MyClass(Person person) {
this.person = validatePerson(person);
}
public MyClass(SomeEnum enum1) {
this.enum1 = validateSomeEnum(enum1);
}
private static Person validatePerson(Person person) {
if (person == null) {
throw new IllegalArgumentException("person cannot be null.");
}
return person;
}
private static SomeEnum validateSomeEnum(SomeEnum enum1) {
if (enum1 == null) {
throw new IllegalArgumentException("enum1 cannot be null.");
}
return enum1;
}
Использование
MyClass myClass = new MyClass(person, enum1);
MyClass myClass = new MyClass(person);
MyClass myClass = new MyClass(enum1);
Вы также можете сделать это с помощью конструкции stati c методы, полезные для уточнения аргументов при наличии неоднозначности, называя метод stati c по-разному:
public static MyClass of(Person person, SomeEnum enum1) {
validatePerson(person);
validateSomeEnum(enum1);
return new MyClass(person, enum1);
}
public static MyClass of(Person person) {
validatePerson(person);
return new MyClass(person, null);
}
public static MyClass of(SomeEnum enum1) {
validateSomeEnum(enum1);
return new MyClass(null, enum1);
}
private static void validatePerson(Person person) {
if (person == null) {
throw new IllegalArgumentException("person cannot be null.");
}
}
private static void validateSomeEnum(SomeEnum enum1) {
if (enum1 == null) {
throw new IllegalArgumentException("enum1 cannot be null.");
}
}
private MyClass(Person person, SomeEnum enum1) {
this.person = person;
this.enum1 = enum1;
}
Использует
MyClass myClass = MyClass.of(person, enum1);
MyClass myClass = MyClass.of(person);
MyClass myClass = MyClass.of(enum1);
Другой вариант - это шаблон Builder, особенно полезный, если есть много дополнительных свойств:
public static final class Builder {
private Person person;
private SomeEnum enum1;
public Builder withPerson(Person person) {
if (person == null) {
throw new IllegalArgumentException("person cannot be null.");
}
this.person = person;
return this;
}
public Builder withSomeEnum(SomeEnum enum1) {
if (enum1 == null) {
throw new IllegalArgumentException("enum1 cannot be null.");
}
this.enum1 = enum1;
return this;
}
public MyClass create() {
if (this.person == null && this.enum1 == null) {
throw new IllegalArgumentException("One of person or enum1 is required.");
}
return new MyClass(this.person, this.enum1);
}
}
private MyClass(Person person, SomeEnum enum1) {
this.person = person;
this.enum1 = enum1;
}
Использует
MyClass myClass = new MyClass.Builder()
.withPerson(person)
.withSomeEnum(enum1)
.create();
MyClass myClass = new MyClass.Builder()
.withPerson(person)
.create();
MyClass myClass = new MyClass.Builder()
.withSomeEnum(enum1)
.create();