Java General Method Optimization : 유사한 요청 개체를 처리하기 위해 추상적 인 부모 클래스 사용
유사한 요청 객체에 대한 일반 처리 로직을 최적화하십시오
소프트웨어 개발에서 우리는 종종 그러한 시나리오를 만듭니다. 다중 데이터 전송 객체 (DTO) 또는 요청 객체는 구조가 매우 유사하며 데이터 검증과 같은 동일한 비즈니스 로직으로 처리해야합니다. 각 유사한 요청 객체에 대해 독립적 인 처리 방법을 작성하는 경우 이러한 메소드의 내부 논리가 정확히 동일하더라도 많은 양의 코드 복제로 이어지고 코드의 유지 관리 및 가독성이 줄어 듭니다.
객체를 만들고 업데이트하는 데 각각 사용되는 다음 두 가지 Java 레코드 유형을 고려하십시오.
공개 레코드 CreateObjectRequest ( CustomObjecta A, CustomObjectB B, CustomObjectc c ) {} 공개 기록 updateObjectefeST ( CustomObjecta A, customObjectB b ) {}
이 두 요청 객체에서 동일한 검증 로직을 수행 해야하는 경우 일반적인 관행은 별도로 과부하 된 검증 방법을 작성하는 것입니다.
공개 클래스 requestValidator { public void validateRequest (createobjectrefest createObjectRequest) { // 동일한 검증 로직 ... System.out.println ( "CreateObjectRequest 검증 ..."); // 예 : A와 B가 비어 있는지 확인합니다 (createObjectRequest.a () == null) { 새로운 불법 행정 exception을 던지십시오 ( "CustomObjecta는 CreateObjectRequest를 위해 null이 될 수 없습니다."); } if (createobjectrequest.b () == null) { 새로운 불법 행위 exception을 던지십시오 ( "ComectObjectB는 CreateObjectRequest를 위해 null이 될 수 없습니다"); } // ... 기타 확인} public void validateRequest (updateObjectRequest updateObjectRequest) { // 동일한 양의 검증 로직 ... System.out.println ( "UpdateObjectRequest 유효성 검증 ..."); // 예 : A와 B가 비어 있는지 확인 if (updateObjectRequest.a () == null) { 새로운 불법 행정 exception을 던지십시오 ( "CustomObjecta는 UpdateObjectRequest에 대해 null이 될 수 없습니다."); } if (updateObjectRequest.b () == null) { 새로운 불법 행위 exception을 던지십시오 ( "CustomObjectB는 UpdateObjectRequest에 대해 null이 될 수 없습니다."); } // ... 기타 확인} }
이 방법은 기능적으로 실현 가능하지만 코드 중복성이 분명히 있습니다. 검증 로직이 복잡해 지거나 수정 해야하는 경우 여러 위치에서 동기식으로 업데이트되어야하며 오류가 발생하기 쉬운 경우가 있습니다.
추상 부모 클래스를 사용하여 코드 재사용을 구현합니다
위의 문제를 해결하기 위해 Java, 특히 추상 클래스 및 상속의 객체 지향 기능을 사용하여 이러한 중복성을 제거 할 수 있습니다. 핵심 아이디어는 모든 유사한 요청 객체에 공통적 인 필드와 동작을 식별하고 공통 상위 클래스로 추상화하는 것입니다.
1. 추상 부모 클래스를 정의하십시오
먼저, 모든 자식 요청 유형에서 공유하는 필드를 포함하는 Objectequest와 같은 추상적 인 부모 클래스를 만듭니다.
// customObjecta 및 customObjectB의 기본 클래스 또는 인터페이스가 customObject라고 가정합니다. 공개 초록 클래스 objectequest { 보호 된 CustomObject a; 보호 된 CustomObject B; // 생성자, getter/setter (필요한 경우) public customObject geta () { 반환 a; } public customObject getb () { 반환 b; } }
참고 :
- 여기에서 CustomObjecta 및 CustomObjectB는 공통 상위 클래스 또는 인터페이스가 있거나 유형 지우기를 통해 처리 할 수있는 경우 CustomObjects로 통합됩니다. 실제 응용 분야에서 CustomObjecta 및 CustomObjectB가 완전히 독립적 인 유형이지만 동일한 필드 이름 만있는 경우 더 복잡한 일반 또는 인터페이스 체계를 고려해야합니다. 그러나 문제 설명에 따르면, 그것들은 "동일한 분야"이며, 추상화 될 수 있음을 암시합니다.
- 이 필드는 보호 된 또는 공개로 선언되므로 서브 클래스가 Getter 방법을 통해 액세스하거나 액세스 할 수 있습니다.
2. 서브 클래스는 추상 부모 클래스를 상속합니다
다음으로, 특정 요청 객체 (예 : CreateObjectRequest 및 UpdateObjectRequest) 가이 추상 부모 클래스를 상속 받도록하십시오. Java Record 유형은 클래스를 직접 상속 할 수 없으므로 레코드를 일반 클래스로 변경하거나 레코드 내의 조합을 통해 부모 클래스의 논리를 참조 할 수 있습니다 (그러나 상속에 의해 가져온 다형성 편의성을 잃습니다). 상속에 의해 가져온 다형성을 달성하기 위해, 우리는 일반적으로 레코드를 일반 클래스로 변환하도록 선택합니다.
// createObjectRequest는 objectRequest를 상속합니다 공개 클래스 CreateoBjectefeST는 objectequest를 확장합니다. 개인 CustomObjectC C; // CreateObjectRevest 고유 한 필드 공개 CreateObjectRequest (CustomObjecta A, CustomObjectB B, CustomObjectC C) { this.a = a; // 부모 클래스에서 상속 된 필드 this.b = b; // 부모 클래스에서 상속 된 필드 this.c = c; } public customObjectc getc () { 반환 c; } } // updateObjectRequest는 objectRequest를 상속합니다 공개 클래스 updateobjectefeSt는 objectequest { // UpdateObjectRequest 고유 한 필드가 없거나 다른 고유 필드가 없습니다. public updateObjectRequest (customObjecta a, customObjectB b) { this.a = a; // 부모 클래스에서 상속 된 필드 this.b = b; // 부모 클래스에서 상속 된 필드} }
참고 : 여기서 customObjecta 및 customObjectB 유형은 objectepeST의 CustomObjects로 통합됩니다. CustomObjecta 및 CustomObjectB가 CustomObject 자체의 서브 클래스가 아니라 공통 속성을 갖는 경우 A 및 B는 공통 인터페이스 또는 기본 클래스 유형으로 선언 될 수 있습니다. 간단하게하기 위해 여기서는 CustomObjecta와 CustomObjectB를 모두 CustomObject 유형으로 참조 할 수 있다고 가정합니다.
3. 일반 처리 방법을 리팩토링합니다
이제 검증 방법은 추상적 인 부모 클래스를 매개 변수로 수락하면됩니다. 다형성을 통해이 방법은 objectepeSt에서 상속 된 모든 서브 클래스 인스턴스를 처리 할 수 있습니다.
공개 클래스 requestValidator { public void validateRequest (objectefeSt objectequest) { // 일반 검증 로직, 이제 system.out.println ( "일반적인 objectquest 검증 ...") 만 쓸 필요가 있습니다. // 부모 클래스에서 공유 필드에 액세스 할 수 있습니다. 새로운 불법 행위 지출 ( "CustomObjecta는 null이 될 수 없습니다")을 던지십시오. } if (dectequest.getb () == null) { 새로운 불법 행위 지출을 던지십시오 ( "CustomObjectB는 NULL이 될 수 없습니다."); } // 특정 서브 클래스에 대한 추가 유효성 검사가 필요한 경우 인스턴스를 사용할 수 있습니다. if (createobjectrequest createreigest의 objectefeSt 인스턴스) { System.out.println ( "CreateObjectrequest 특정 유효성 검증 수행"); if (createrequest.getc () == null) { 새로운 불법 행위 exception을 던지십시오 ( "comectionobjectc는 createobjectrequest를 위해 null이 될 수 없습니다"); } } else if (updateObjectRequest updateRequest의 objectefeSt 인스턴스) { System.out.println ( "업데이트 업 updateObjectrequest 특정 유효성 검증 수행"); // updateObjectRequest에 대한 고유 한 검증} // ... 기타 일반 확인} }
이런 식으로, 우리는 반복 된 검증 로직을 하나의 방법으로 성공적으로 중앙 집중화합니다. 일반 검증 로직을 수정하거나 확장 해야하는 경우, validateRequest (objectrequest objectrefest) 메소드 만 수정하면 코드의 유지 관리 가능성과 확장 성이 크게 향상됩니다.
요약 및 모범 사례
추상적 인 부모 클래스를 사용하여 공통 방법을 최적화하는 것은 Java의 강력한 코드 재사용 패턴입니다. 다음 시나리오에서 작동합니다.
- 여러 클래스는 많은 수의 동일한 분야와 행동을 공유합니다 .이 클래스는 개념적으로 동일한 클래스의 사물에 속하지만 고유 한 특성이 있습니다.
- 이러한 유사한 클래스에는 동일한 작업이 필요합니다 (예 : 검증, 직렬화, 변환 등).
이점:
- 코드 중복성 감소 : 동일한 비즈니스 논리를 반복적으로 쓰지 마십시오.
- 유지 관리 가능성 향상 : 논리적 수정은 한 곳에서만 수행하면됩니다.
- 강화 확장 성 : 새로 추가 된 유사한 요청 유형은 추상 부모 클래스를 상속하여 자동으로 일반 처리 능력을 얻을 수 있습니다.
- 가독성 향상 : 코드 구조가 명확하고 의도가 더 명확합니다.
참고 :
- 초과 주식 : 클래스간에 공통점이 거의 없거나 관련없는 클래스를 함께 추상화 해야하는 경우 과잉 복잡한 설계로 이어지고 가독성을 줄일 수 있습니다.
- 상속의 한계 : Java는 단일 상속 언어입니다. 클래스가 다른 클래스를 상속 한 경우 상속을 통해 일반 논리를 재사용 할 수 없습니다. 현재 인터페이스와 기본 메소드, 조합 패턴 또는 제네릭과 같은 기타 디자인 패턴을 결합하는 것을 고려할 수 있습니다.
- 레코드 유형의 제한 : 레코드 유형은 Java 16에 도입되었습니다. 설계 목표는 불변의 데이터 운송 업체가되어 다른 클래스를 상속 할 수는 없지만 인터페이스를 구현할 수는 없습니다. 따라서 상속과 함께 다형성을 구현 해야하는 경우 레코드를 전통적인 클래스로 변환해야 할 수도 있습니다.
추상화와 상속을 합리적으로 사용하여 개발자는보다 우아하고 견고하며 Java 코드를 유지하기가 더 쉽게 작성할 수 있습니다.
위 내용은 Java General Method Optimization : 유사한 요청 개체를 처리하기 위해 추상적 인 부모 클래스 사용의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undress AI Tool
무료로 이미지를 벗다

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Stock Market GPT
더 현명한 결정을 위한 AI 기반 투자 연구

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

-CP 매개 변수를 사용하여 JVM이 ClassPath에 추가하여 JAVA -Clibrary.jarcom.example.Main과 같은 내부 클래스 및 리소스를로드 할 수 있으며, 이는 세미콜론 또는 콜론으로 분리 된 여러 항아리를 지원하며 클래스 경로 환경 변수 또는 Manifest.MF를 통해 구성 할 수 있습니다.

usefile.createnewfile () to reatefileonlyifitdoesn'texist, 피하기;

Amplements 키워드를 사용하여 인터페이스를 구현하십시오. 이 클래스는 인터페이스에서 모든 메소드의 특정 구현을 제공해야합니다. 여러 인터페이스를 지원하고 메소드가 공개되도록 쉼표로 분리됩니다. Java 8 이후의 기본 및 정적 메소드는 다시 작성할 필요가 없습니다.

Javaspi는 JDK의 내장 서비스 검색 메커니즘이며 Serviceloader를 통한 인터페이스 지향 동적 확장을 구현합니다. 1. 서비스 인터페이스를 정의하고 Meta-Inf/Services/에서 인터페이스의 전체 이름을 가진 파일을 작성하고 구현 클래스의 정규화 된 이름을 작성하십시오. 2. serviceloader.load ()를 사용하여 구현 클래스를로드하면 JVM은 자동으로 구성을 읽고 인스턴스화합니다. 3. 인터페이스 계약은 설계 중에 명확 해지고 우선 순위 및 조건부로드를 지원하며 기본 구현을 제공해야합니다. 4. 응용 프로그램 시나리오에는 다중 지불 채널 액세스 및 플러그인 확인이 포함됩니다. 5. 성능, 클래스 경로, 예외 분리, 스레드 안전 및 버전 호환성에주의하십시오. 6. Java9에서는 모듈 시스템과 함께 제공 될 수 있습니다.

javagenericsprovidecompile-timetypesafetyandeliminatecastingtypeparametersonclasses, interfaces, methods; wildcards (?,? extendStype,? supertype) handlUnknowntypeswithflexible.1.useUnunUnunUndwildCardWhentyPeiLISIRVENTERREATHERNEATHEATHEATHEATHEATHEATHEATHEATHEATHEARVENTOUBERDERRELOUNTERRELONTERREATHEARBERBERBENTECASTS;

이 기사에서는 동일한 TCP 소켓, 즉 HTTP 영구 연결 (Keep-Alive)에서 여러 HTTP 요청을 전송하는 메커니즘을 심층적으로 살펴 봅니다. 이 기사는 HTTP/1.X와 HTTP/2 프로토콜의 차이를 명확히하고 지속적인 연결에 대한 서버 측 지원의 중요성과 연결을 올바르게 처리하는 방법 : 응답 헤더를 정확하게 처리하는 방법을 강조합니다. 일반적인 오류를 분석하고 모범 사례를 제공함으로써 개발자가 효율적이고 강력한 HTTP 클라이언트를 구축 할 수 있도록 도와줍니다.

속성 클래스를 사용하여 Java 구성 파일을 쉽게 읽으십시오. 1. config.properties를 리소스 디렉토리에 넣고 getClassLoader (). getResourCeasStream ()을 통해로드하고로드 () 메서드를 호출하여 데이터베이스 구성을 읽습니다. 2. 파일이 외부 경로에있는 경우 FileInputStream을 사용하여로드하십시오. 3. GetProperty (키, 기본값)를 사용하여 누락 된 키를 처리하고 기본값을 제공하여 예외 처리 및 입력 확인을 보장합니다.

이 튜토리얼은 Java의 다른 배열 목록을 포함하는 중첩 된 배열 목록을 효율적으로 처리하고 모든 내부 요소를 단일 배열로 병합하는 방법을 자세히 설명합니다. 이 기사는 Java 8 Stream API의 FlatMap 작동을 통해 두 가지 핵심 솔루션을 제공합니다. 첫 번째는 목록으로 평평한 다음 배열을 채우고 다른 시나리오의 요구를 충족시키기 위해 새로운 배열을 직접 작성합니다.
