2010-12-17 2 views
5

항상 자바에서 저를 성가 시게 한 한 가지입니다 : 당신이 다운 스트림 소비자에 의해 사용하지만 멋지게가에 의존하는 클래스를 구성해야합니다 하나의 공용 클래스를 만들려면 어떻게해야합니까자바 public 클래스

패키지?

예를 들어 (다소 인위적으로) 저는 LdapPersistenceHelper와 DBPersistenceHelper에 의존하는 UserDao 클래스가 있습니다. UserDao 클래스는 com.company.dao라는 패키지에 있으며 두 명의 도우미가 com.company.dao.persistencehelper라는 패키지에 살고 싶습니다. 그러나 저는 두 명의 도우미가 다른 사람들이 사용할 수있을 정도로 일반화하기를 원하지 않습니다. 어떻게 그럴 수 있니? 도우미를 "보호"(실제로는 수정 자 없음)하게하면 UserDao에서 도우미에게 연락 할 수 없습니다. 공개하면 다른 사람이 사용하게됩니다.

답변

1

하나의 옵션은 공용 클래스와 동일한 패키지에 넣을 수 있지만 패키지 액세스 권한이 있습니다.

OSGi를 사용하는 경우, 내 보낸 패키지 세트에서 구현 패키지를 제외 할 수 있습니다.

+0

흥미로운 점은 OSGI를 사용하여이 문제를 해결할 생각이 없다는 것입니다. – silk

3

동일한 패키지에 클래스를 배치하지 않는 한이를 적용 할 방법이 없습니다. 하위 패키지 가시성을 정의 할 방법이 없습니다.

+0

질문이 있습니다. 수식어가없는 클래스에서 라이브러리를 사용하면 해당 패키지에서만 사용할 수 있습니다. 그리고 내 프로젝트에서 같은 이름의 패키지를 만듭니다. 이런 식으로 나 자신의 패키지로 라이브러리의 클래스를 사용할 수 있습니까? –

+0

예. 그러나이 언어는 불법 행위가 아닌 사고를 예방하도록 고안되었습니다. Stroustrup은 D & E에서 C++과 동일한 구분을합니다. –

+0

예, 가능합니다. java.lang, lava.util 등을 제외하고:) – Bozho

6

근본적인 문제는 패키지를 사용하여 "멋지게 정리"하는 것입니다. Java 패키지가 생성되었을 때, (1) 세계적으로 고유 한 클래스 이름 지정과 (2) 보호 된/기본 액세스 수정 자 사용 촉진이라는 두 가지 설계 목표가있었습니다.

패키지와 일치하는 소스의 폴더 구조가 있어야한다는 사실은 "예쁜/체계적인 폴더 구조"를 만드는 데 필연적으로 사용됩니다. 그러나 그것이 생성 된 것이 아니며, 결과적으로 지원을 위해 생성 된 액세스 한정자와 잘 작동하지 않습니다.

편집 : 제쳐두고, 나는 어떤 식 으로든 판단을 내리지 않을 것입니다. 나는 첫 문장이 중요하게 들릴지도 모른다는 것을 깨달았다. 많은 프로젝트가 합법적으로 보호되고있는 접근에서 지각 된 가치의 약간의 여분의 비트를 짜내려고 노력하는 것의 위로 조직적이고 유지할 수있는 구조를 선택한다. 도우미 유틸리티가 공개되면 정말 나쁠까요? 다른 개발자가 오용하지 않는 액세스 권한을 신뢰하지 않는다면 액세스 수정 자도 변경하지 않고도 신뢰할 수 있습니까?

+0

엄격하게 Bozho가이 질문에 답하는 동안 나는이 대답을 더 좋아한다. 설계 문제를 고맙게 여기기 때문이다. – silk

+0

+1 이것은 훨씬 더 우수한 대답이다. 도우미 클래스를 공용 인터페이스에 맞게 만들거나 사용할 수있는 일반 유틸리티로 만들 준비가되지 않은 경우에는 자체 패키지에 패키지를 만들 수 없습니다. 사실 UserDao 인스턴스의 컨텍스트 외부에서 이해가되지 않는다면 아마도 자신의 클래스 파일에 속하지 않을 것입니다. –

+0

@ 팀 : 그게 명백히 진실이 아니야. 일반적으로 외부 사용을 위해 배포하지 않으려는 재사용 가능한 코드의 전체 라이브러리가있을 수 있으므로 향후 이진 호환성을 제공하기 위해 암시 적으로 계약을 맺습니다. –

1

다른 사람들이 사용하는 것에 대해 걱정하지 않을 것입니다. 내부 패키지로 문서화하십시오. 어쩌면 패키지 "내부"또는 "impl"아래에 넣을 수도 있습니다. 어쨌든 누군가를 부적절하게 사용하면 해를 끼칠 수 있고 자신을 비난 할 수 있습니다 (유일한 위험은 해당 클래스에 대한 이전의 호환되지 않는 변경 사항을 처리하는 것일 수 있음).

강력한 격리를 원하면 OSGi를 사용하십시오.

1

참고 :이 문제를 해결할 수있는 방법 중 하나는 (다른 사용자가 사용할 수 있도록 JAR을 배포하는 경우) obfuscater (나는 ProGuard을 권장)를 사용하여 공개적으로 사용할 수없는 클래스를 난독 화하는 것입니다. 다시 말하지만 이것은 고의적 인 불법 행위를 방지하지는 않지만 클래스와의 하위 호환성을위한 계약이 없다는 것을 분명하게 알 수 있습니다. (그리고 그것을 사용하는 방법을 파악하는 것이 기술적으로 어렵습니다.)