2012-07-09 5 views
9

이 .jar를 개발자에게 배포하려는 최종 제품으로 Java 라이브러리를 만듭니다.Java 클래스 범위 및 라이브러리

내 라이브러리를 Objective-C에서 "번역"하고 있으며 개발자가 어떤 클래스 헤더 파일을 사용할 수 있는지 제어합니다. 다시 말해 개발자에게 처리 할 수있는 몇 가지 클래스 만 공개합니다.

내 Java 라이브러리에서 패키지를 사용 중이고 패키지가 상당히 커졌습니다. 그래서 저는 제 모델과 컨트롤러를 다른 패키지로 분리하기로 결정했습니다. 하지만 이제는 개인적으로 유지하고 싶은 모델을 기본 패키지에서 사용하려면 공개로 표시해야합니다.

내 질문은 이것이 내가 Objective-C에서하고 있었던 것에 대한 것인가?

예를 들어 실제로 내부에서만 사용되는 Event 클래스가 있는데 사용자가 그것에 대해 알거나 생각하지 않기를 바랍니다. 사용자가 관리 인스턴스를 얻을 수있는 또 다른 클래스 인 TimedEvent가 있습니다.

내 Objective-C에서 나는 단순히 이벤트 클래스를 라이브러리 공용 범위에서 제외하여 TimedEvent를 허용했습니다.

내 라이브러리에서 일을 좀 더 깔끔하게 만들면 패키지가 길지 않은 것처럼 보입니다. 지금부터 내 메인 컨트롤러는 주요 패키지에 들어 있으며 모든 모델은 다른 패키지에 들어 있으므로 공개 범위가 있어야합니다.

의견?

답변

5

이 자바 가능하지만 이유가 왜 (거의) 아무도 당신이 구현과 같은 패키지로 인터페이스를 넣을 경우

, 당신은 모든 액세스 한정자를 생략 할 수 있습니다 ... 그것을하지 않습니다 (private , protected, public)을 클래스 및 메소드에서 가져 와서 "기본"또는 "패키지"가시성을 제공합니다. 동일한 패키지의 클래스 만이 해당 클래스를보고 사용할 수 있습니다.

단점 : API와 구현을 혼합해야합니다.

다른 방법은 구현을 패키지 *.private.*으로 옮기는 것입니다. API와 구현이 더 이상 섞이지는 않지만 악의적 인 사용자는 쉽게 구현에 액세스 할 수 있습니다. 이는 이름 지정 규칙 일뿐입니다. 정지 표시와 마찬가지로 : 이는 ("조심하십시오") 무언가를 의미하지만 실제로 멈추지는 않습니다.

마지막으로 인터페이스 내부에서 인터페이스를 구현할 수 있습니다. 예 :

public interface IFoo { 
    String getName(); 

    private static class Foo implements IFoo { 
     public String getName(); 
    } 

    public static class FooFactory { 
     public static IFoo create() { return new Foo(); } 
    } 
} 

추악한가요?

+2

멋진 터치 인터페이스의 내부 구현에. 그게 새로운 기능입니까? –

+1

아니, Java가 내부 클래스를 지원하기 때문에 (1.2, 제 생각에는) 보일러 플레이트 코드가 많이 추가되었습니다. –

+0

많은 교과서가이 점을 잘못 알고 있습니다. "인터페이스 : 상수 및 메서드 선언" –

4

클래스에 대한 노출을 제어하는 ​​일반적인 방법은 인터페이스 및 팩토리 뒤에 구현을 숨기는 것입니다.

  • 공장 공개 가시성을 줘 서브 패키지
  • 의 주요 패키지의 인터페이스 및 공장을 넣어 당신의 TimedEvent위한 인터페이스를 만들고 TimedEvent 인터페이스
  • 의 인스턴스를 작성하기위한 클래스
  • 하위 패키지에 인터페이스를 구현하여 패키지 가시성 제공
  • 공장에서 TimedEvent 인터페이스를 구현하는 클래스의 인스턴스를 만듭니다.
  • 여기

는 당신이 그것을 할 수있는 방법의 예입니다

package com.my.main; 
public interface TimedEvent { 
    void fire(); 
} 

package com.my.main.events; 
import com.my.main; 
public class EventFactory { 
    public TimedEvent makeTimedEvent() { return new TimedEvent(); } 
} 
// TimedEventImpl has package visibility - it is not public. 
class TimedEventImpl implements TimedEvent { 
    public void fire() { 
     // Fire a timed event 
    } 
} 

사용자는 다음과 같이 TimedEvent에 액세스 할 :

com.my.main.events.EventFactory f = new com.my.main.events.EventFactory(); 
com.my.main.TimedEvent evt = f.makeTimedEvent(); 
evt.fire();