2014-07-13 2 views
4

나는 SourceFactory, Source 및 SourceTypeI의 세 가지 클래스로 구성된 경우가 있습니다. SourceFactory에서만 SourceTypeI의 인스턴스를 만들고 싶습니다. 즉, SourceFactory 이외의 클래스는 SourceTypeI의 인스턴스를 작성할 수 없습니다. 다른 클래스가 SourceTypeI를 만들 수 없도록하려면 어떻게해야합니까?다른 클래스가 하나의 클래스의 인스턴스를 만드는 것을 방지하려면 어떻게해야합니까?

예상 사용법; 나는 당신의 질문을 이해하면

SourceFactory sF = new SourceFactory(); 
    Source source = sF.createSource(); 

    // from there, I should reach methods of SourceTypeI via source 
    source.whoIs(); 

클래스

|-------------|   |-----------------------| 
    |SourceTypeI |   |SourceFactory   | 
    |-------------|   |-----------------------| 
    |+whoIs():void|   |+createSource():Source | 
    |    |   |      | 
    |-------------|   |-----------------------| 

    |-----------------------------| 
    | Source     | <- Source cannot be instantiated, it is used just a 
    |-----------------------------| for referencing instance of SourceTypeI 
    |        | 
    |-----------------------------| 
+3

제한된 소스 (코드 쇼로 표시됨) 또는 SourceTypeI (텍스트가 말하는대로)입니까? – laune

답변

1

, 당신은 같은 패키지에 SourceFactorySourceTypeI를 넣을 수 있습니다. 그런 다음 SourceTypeI 결승을하십시오. 다음으로 SourceTypeI 패키지 레벨 (기본) 생성자를 제공하십시오.

SourceTypeI() { // <-- not public, not private, not protected. 
    super(); 
} 

그런 다음 해당 패키지에 "다른 클래스 (들)"를 넣지 마십시오.

+0

Source 클래스를 통해 SourceTypeI 메소드에 접근 할 수 있도록 다른 두 클래스에서 무엇을해야합니까? 또는 뭔가를 써야하나요? –

+0

@Zmavus'SourceTypeI' 메소드를 생성자가 아닌 public으로 만듭니다! –

1

이름을 변경해 죄송합니다.

public interface Restricted { // Source 
    public int getX(); 
} 

public class Restrict { // SourceFactory 
    private class RestrictedImpl implements Restricted { 
     public int getX(){ return 42; } 
    } 

    public Restricted createRestricted(){ 
     return new RestrictedImpl(); 
    } 
} 

Restrict restrict = new Restrict(); 
Restricted restricted1 = restrict.createRestricted(); 
+0

답변 해 주셔서 감사합니다. 'RestrictedImpTypeII'를 구현해야하기 때문에'RestrictedImp' 클래스가 자체 파일을 가질 수 있습니까? Restrict에 두 클래스를 넣으면 전체 코드 품질이 떨어집니다. –

+1

Java로 얻을 수있는 가시성의 제한에는 한계가 있습니다. Elliots는 패키지가 여러분이 가야 할 방법 일 수 있다고 언급합니다. OTOH, 당신은 Source/Restricted의 다른 구현물을 다른 래퍼로 래핑 할 수 있으며, 클라이언트가 고통을받지 않도록 개별 팩퍼드에 createXyz를 위임하는 단일 Factory를 여전히 가질 수 있습니다. – laune

+0

java에 C++'friend' 키워드가 있습니까? 나는 친구 클래스의 수업 방법으로 성취 할 수 있습니다. –

관련 문제