Java에서 패키지 개인 클래스의 장단점?
최근에 Java를 배우고 package-private
있는데 아무것도 지정하지 않으면 기본값 인 클래스 개념을 발견했습니다 . 그러나 나는 깨달았습니다.
나는 패키지 개인 클래스의 사용을 거의 보지 못합니다. 이에 대한 이유가 있습니까? 예를 들어 심각한 단점이 있거나 중복되거나 단순히 충분히 읽지 않고 있습니까? 사용에 대한 / 반대하는 강력한 주장이 있습니까?
대부분의 경우 실제로 유용하지 않은 경우 왜 기본값일까요?
현실 세계에서 어떤 상황에서 package-private를 사용해야합니까? 즉, 언제 대체 불가능하게 될까요?
즉, 기본 패키지 전용 수정 자의 주요 장단점은 무엇입니까?
짧은 대답은-약간 더 넓은 형태의 개인입니다.
나는 당신이와 사이의 구분에 익숙하다고 가정 public
하고 private
, private
문제의 클래스 내부에서만 사용할 경우 메서드와 변수를 만드는 것이 일반적으로 좋은 습관이되는 이유를 가정 할 것입니다.
그 확장으로 모듈 식으로 소프트웨어를 만드는 것을 생각하고 있다면 모듈에 대한 공용 인터페이스를 생각할 수 있습니다. 모듈 내부에는 여러 클래스가 서로 협력하게됩니다. 이러한 맥락 public
에서 소비자가 메서드 를 호출 할 경우 메서드를 만드는 것이 합리적입니다 . private
클래스 내부에 있다면; 그리고 package private
그들은이 모듈의 클래스 사이에 호출에 사용하는 경우,하지만 스팬 여러 클래스 (공개 호출자와 같이)는 모듈의 구현 세부입니다 즉.
이것은 패키지 시스템이 이런 종류의 일에 그렇게 유용하지 않은 것으로 밝혀 졌기 때문에 실제로 거의 사용되지 않습니다. 주어진 모듈에 대한 모든 클래스를 정확히 동일한 패키지에 덤프해야하는데, 사소하지 않은 것은 조금 다루기 힘들 것입니다. 그래서 아이디어는 훌륭합니다. 약간 더 넓은 "근처"클래스에 접근 할 수있는 메소드를 만들 수 있습니다. private
하지만 클래스 세트를 정의하는 방법에 대한 제한은 거의 사용 / 유용하지 않음을 의미합니다.
package-private의 한 가지 좋은 점은 단위 테스트 클래스에 대해 비공개로 간주하는 메서드에 대한 액세스 권한을 부여하는 데 사용할 수 있다는 것입니다. 물론 패키지의 다른 클래스가 실제로는 안될 때 호출 할 수 있다는 단점이 있습니다.
캡슐화와는 별도로 패키지 전용 클래스를 사용하는 주요 이점 중 하나는 프로젝트의 javadoc에 나타나지 않는다는 것입니다. 따라서 다른 용도는 없지만 공용 클래스가 클라이언트가 필요로하는 작업을 수행 할 수 있도록 돕는 일부 도우미 클래스를 사용하는 경우 라이브러리 사용자를 위해 가능한 한 간단하게 유지하기 위해 패키지를 비공개로 설정하는 것이 좋습니다.
예를 들어 제가 개발 한 라이브러리를 볼 수 있습니다. javadoc에서는 비록 5의 인터페이스 (12 개) 클래스를 포함 소스 코드를 더 많이 갖는다. 그러나 숨겨진 것은 대부분 클라이언트에게 부가 가치를 제공하지 않는 내부 레이어입니다 (일반적으로 모든 추상 기본 클래스가 숨겨져 있음).
JDK에도 많은 예가 있습니다.
"왜 디폴트가 되는가"라는 질문과 관련하여,이 문맥에서 "디폴트"라는 용어는 다른 한정자가 없음을 의미합니다. 나는 그들이 다른 키워드를 발명 할 수 있었을 것 같지만 ( "패키지"는 이미 사용 되었음) 그러나 그들은 그렇게하지 않았다.
현실 세계에서는 사람들이 다른 패키지에서 호출하거나 사용하지 않기를 바라는 유틸리티 클래스와 추상 클래스에 대한 기본 액세스를 사용합니다. 일부 추상 클래스에서 확장되는 인터페이스와 두 개의 구체적인 구현이 있다고 가정 해 보겠습니다. 사람들이 반드시 하위 클래스로 분류하는 것을 원하지 않기 때문에 두 개의 구체적인 클래스를 final로 선언합니다 (Effective Java 참조). 당신은 또한 같은 이유로 사람들이 당신의 추상 클래스와 함께 멍하니 다니기를 원하지 않습니다. 추상 클래스에 대한 기본 액세스를 사용하면 사람들은 자신의 클래스를 패키지에 넣을 때만 볼 수 있습니다. 방탄은 아니지만 기본 액세스의 합리적 사용 / 예시라고 생각합니다. 즉, 사적인 것처럼 세부 정보가 유출되는 것을 방지하지 않는다는 사실, 즉 아무것도 보장하지 않는다는 것은
더 자주 사용되지 않는 또 다른 이유는 사람들이 기본 액세스 권한이있는 클래스를 javadoc에서 제외하는 경향이 있기 때문입니다.
패키지-개인 액세스 수준은 다음보다 더 제한적입니다 protected
. 보호 된 속성 및 메서드는 단순히 클래스를 서브 클래 싱하여 액세스 할 수 있습니다. 보호 된 멤버는 상속을위한 것이며 패키지 전용 멤버는 그렇지 않습니다.
패키지 전용 멤버는 종종 사용되므로 패키지 내의 여러 클래스가 구현 별 특성 또는 (유틸리티) 메서드에 액세스 할 수 있습니다 .
이에 대한 좋은 예는의 패키지 전용 생성자 String
와 StringBuilder.value
char 배열입니다.
/*
* Package private constructor which shares value array for speed.
* this constructor is always expected to be called with share==true.
* a separate constructor is needed because we already have a public
* String(char[]) constructor that makes a copy of the given char[].
*/
String(char[] value, boolean share) {
// assert share : "unshared not supported";
this.value = value;
}
따라서 java.lang
패키지 내부의 클래스 Strings
는 char[]
보안을 손상시키지 않고 콘텐츠가 이미에있는 경우 효율적으로 새로 만들 수 있습니다 . 가능하다면 String
불변 (반사 계산되지 않음!) 인의 내부 char 배열에 액세스 (참조) 할 수 있기 때문에 애플리케이션에서이를 수행 할 수 없습니다 .
에서는 StringBuilder
(또는 오히려 AbstractStringBuilder
구현 출처) 현재 값을 유지 문자 배열 char[] value
및 이에 접근 방법 char[] getValue()
있고 그렇게 다양한 유틸리티 메소드 전용 패키지 String
등 contentEquals(StringBuffer sb)
및 contentEquals(CharSequence cs)
상기 내부 문자 배열을 노출시키지 않고 비교 효율이 활용 빠르게 할 세계".
1-아키텍처에 따라 다름-일반적으로 자신만을위한 코드를 작성하고 소규모 프로젝트에서는 사용하지 않을 것입니다. 대규모 프로젝트에서는 특정 메서드가 호출되는 위치와 방법을 제어 할 수 있는지 확인하는 것이 도움이 될 수 있습니다.
2-기본값 (즉, 공개 / 보호 / 비공개 아님)은 비공개와 동일하지 않으며 4 번째 상태입니다. Java 액세스 제어 참조
3-기본 코드를 구현하는 방법에 의존하는 타사를 원하지 않는 라이브러리를 작성할 때 삶을 더 쉽게 만들 수 있습니다. API 자체를 공개하기 만하면됩니다.
수업에 대해 말할 때는 두 가지 옵션 만 있습니다.
- 공개 수업
- 패키지 개인 수업
"개인 클래스"의 개념은 의미가 없습니다. (어디서도 사용하지 않는 수업을 만드는 이유는?!)
So if you have a class for intermediate operations that needn't to be exposed to API users you are supposed to declare it as "package private"
Also when you define many classes in the same source file, only one class is allowed to be public (its name matched the .java file name). If any other class is defined in the same file it must be "package private".
"Package Private" its used when you have several packages, and it means, other classes in the same package can access that class or class member as "public", classes in other packages cannot access, its like "private like them."
참고URL : https://stackoverflow.com/questions/6470556/pros-and-cons-of-package-private-classes-in-java
'Program Tip' 카테고리의 다른 글
DAO 및 서비스 계층 (JPA / Hibernate + Spring) (0) | 2020.11.28 |
---|---|
'this'는 JavaScript 클래스 메서드에서 정의되지 않았습니다. (0) | 2020.11.28 |
연속적인 JSON 스트림 처리 (0) | 2020.11.28 |
MongoDB에 저장된 배열이 순서를 유지합니까? (0) | 2020.11.28 |
반복기에서 map () 사용 (0) | 2020.11.28 |