Java에서 매개 변수가 많은 생성자 관리
일부 프로젝트에서는 체인을 따라 더 많은 파라미터를 추가하는 클래스 계층이 있습니다.하위에는 최대 30개의 파라미터를 가질 수 있는 클래스도 있습니다.이 중 28개는 슈퍼 컨스트럭터로 전달됩니다.
Guice와 같은 것을 통해 자동 DI를 사용하는 것은 좋지만, 기술적인 이유로 이러한 특정 프로젝트는 Java에 한정되어 있습니다.
유형을 리팩터링한 경우(인수 2에 대해 전달한 원이 이제 쉐이프) 갑자기 순서가 어긋날 수 있으므로 인수를 유형별로 알파벳 순으로 구성하는 규칙은 작동하지 않습니다.
이 질문은 구체적이고 "그것이 당신의 문제라면 디자인 차원에서 잘못하고 있다"는 비판으로 가득 차 있을 수 있지만, 저는 단지 어떤 관점도 찾고 있을 뿐입니다.
Builder Design Pattern이 도움이 될 수 있습니다.다음 예를 생각해 보겠습니다.
public class StudentBuilder
{
private String _name;
private int _age = 14; // this has a default
private String _motto = ""; // most students don't have one
public StudentBuilder() { }
public Student buildStudent()
{
return new Student(_name, _age, _motto);
}
public StudentBuilder name(String _name)
{
this._name = _name;
return this;
}
public StudentBuilder age(int _age)
{
this._age = _age;
return this;
}
public StudentBuilder motto(String _motto)
{
this._motto = _motto;
return this;
}
}
이를 통해 다음과 같은 코드를 작성할 수 있습니다.
Student s1 = new StudentBuilder().name("Eli").buildStudent();
Student s2 = new StudentBuilder()
.name("Spicoli")
.age(16)
.motto("Aloha, Mr Hand")
.buildStudent();
필수 필드(아마 이름은 필수)를 생략하면 학생 생성자가 예외를 발생시킬 수 있습니다.또한 기본/옵션 인수를 사용할 수 있으므로 인수 순서를 추적할 필요가 없습니다.이러한 콜의 순서는 모두 동일하게 기능하기 때문입니다.
오브젝트 내에 관련 파라미터를 캡슐화할 수 있습니까?
예를 들어 파라미터가 다음과 같은 경우
MyClass(String house, String street, String town, String postcode, String country, int foo, double bar) {
super(String house, String street, String town, String postcode, String country);
this.foo = foo;
this.bar = bar;
대신 다음을 수행할 수 있습니다.
MyClass(Address homeAddress, int foo, double bar) {
super(homeAddress);
this.foo = foo;
this.bar = bar;
}
빌더 클래스가 필요할 것 같습니다.그런 다음 다음과 같은 작업을 수행합니다.
MyObject obj = new MyObjectBuilder().setXxx(myXxx)
.setYyy(myYyy)
.setZzz(myZzz)
// ... etc.
.build();
이 Josh Bloch 프레젠테이션(PDF)의 8페이지 및 그 이후의 내용 또는 유효한 Java에 대한 이 리뷰를 참조하십시오.
빌더 패턴을 사용하는 것도 하나의 해결책일 수 있습니다.
하지만 20~30개의 파라미터가 나오면 파라미터 사이에 높은 관계가 있다고 생각합니다.따라서 (제안대로) 논리적으로 올바른 데이터 객체로 정리하는 것이 가장 합리적일 것입니다.이렇게 하면 데이터 개체가 매개 변수 간 제약 조건의 유효성을 이미 확인할 수 있습니다.
지금까지의 모든 프로젝트에서 파라미터가 너무 많은 경우가 있었습니다(28개가 아니라8개).나는 더 나은 데이터 모델을 만들어서 코드를 삭제할 수 있었다.
Java 1.4로 한정되어 있기 때문에 DI를 원하신다면 Spring이 매우 적절한 옵션입니다.DI는 컨스트럭터 파라미터가 서비스이거나 런타임 중에 변하지 않는 경우에만 도움이 됩니다.
오브젝트 작성 방법에 대한 변수 옵션이 필요하기 때문에 이러한 모든 다른 생성자가 있는 경우 Builder 패턴 사용을 진지하게 고려해야 합니다.
최선의 해결책은 생성자에 매개 변수가 너무 많지 않은 것입니다.생성자에 실제로 필요한 매개 변수만 개체를 올바르게 초기화하기 위해 필요한 매개 변수입니다.여러 매개 변수를 가진 생성자를 가질 수 있지만 최소 매개 변수만 있는 생성자를 가질 수도 있습니다.추가 생성자는 이 단순 생성자를 호출하고 그 후에 설정자를 호출하여 다른 매개 변수를 설정합니다.이렇게 하면 점점 더 많은 매개 변수와의 연쇄 문제를 피할 수 있을 뿐만 아니라 편의 구성 요소도 몇 가지 있습니다.
빌더 패턴을 사용할 때는 이머터블이나 POJOBuilder를 사용하는 것을 추천합니다.
파라미터의 수와 상속 계층의 깊이를 줄이기 위해 리팩터링을 하는 것이 제가 생각할 수 있는 전부입니다.왜냐하면 20대 파라미터를 올바르게 유지하는 데 도움이 되는 것은 아무것도 없기 때문입니다.매뉴얼을 보면서 모든 콜을 수행해야 합니다.
한 가지 방법은 논리적으로 그룹화된 파라미터를 자신의 상위 레벨의 오브젝트로 그룹화하는 것입니다만, 그 자체에는 문제가 있습니다.
언급URL : https://stackoverflow.com/questions/222214/managing-constructors-with-many-parameters-in-java
'programing' 카테고리의 다른 글
VueJs 소품이 구성 요소에 정의되어 있지 않습니다. (0) | 2023.01.27 |
---|---|
디렉토리를 재귀적으로 작성하려면 어떻게 해야 합니까? (0) | 2023.01.17 |
MySQL: MySQL 루트 비밀번호를 리셋 또는 변경하는 방법 (0) | 2023.01.17 |
Maria에서 strict 모드 사용 안 함DB (0) | 2023.01.17 |
PhpStorm을 사용하여 선택 항목을 따옴표로 묶는 방법은 무엇입니까? (0) | 2023.01.17 |