2011-03-29 4 views
6

클래스는 자바에 공개해야하지 않는 한 사용 패키지 가시성 (기본값),패키지 가시성

+1

약간의 배경을 읽으면 도움이 될 것입니다. [Thinking In Java] (http://www.mindview.net/Books/TIJ/) 5 장. 이전에 모두 작성되었습니다. –

+1

인터페이스의 경우 기본 표시 여부는 공개입니다. ;) –

답변

0

당신이 어떤 액세스 한정자 (즉, 공공 개인 또는 보호)하지 않고, default 수정 예에 의해 얻을 무엇, 그것은을 의미하는 이유 특정 패키지 내의 모든 사용자에게 표시됩니다. 따라서 수업을 자체 패키지로만 액세스 할 수있게하려면 default으로 이동해야합니다.

더 읽기 : Controlling Access

3

내 understaning는, 패키지/기본 액세스 패키지 내부위한 패키지 인터페이스, 패키지 외부에서 사용해서는 안 즉 클래스를 형성하지 않습니다 즉 클래스입니다.

7

Rostislav Matl이 말했듯이 패키지 인터페이스에 포함되지 않는 것을 만들 때 유용합니다.

예를 들어, 패키지가 있고 인터페이스와 서비스의 적어도 하나의 구체적인 구현을 제공한다고 가정 해 보겠습니다.

이 서비스를 사용하는 사람들은 귀하가 제공하는 구체적인 수업 중 하나를 사용하고 인터페이스를 중요하게 생각하지만 그 이외의 많은 것을 신경 쓰지 않을 것입니다. 우리의 서비스는 데이터베이스와 대화해야하며 데이터베이스 쿼리의 결과를 자체 데이터 형식 (계약서 양식)으로 매핑 할 수 있어야합니다.

필자는 유틸리티 유형 메서드가 포함 된 패키지 개인 도우미 클래스를 정기적으로 만들거나 필요한 매핑과 같은 작업을 수행한다는 것을 알게되었습니다. 패키지 내부의 다른 클래스는이 헬퍼를 사용할 수 있지만 패키지 외부의 아무도 볼 수 없으므로 언제든지 변경할 수 있으므로 기본 (패키지 비공개) 가시성이 완벽합니다.

우리는 우리의 인터페이스가 :

이것은 몇 가지 코드를 사용하여 예입니다

public interface UsefulService { 
    Collection<DataThings> getThings(Identifier id); 
} 

을 ... 그리고 우리의 구체적인 구현 :

public class JdbcUsefulServiceImpl implements UsefulService { 

    //We can break the code for the mapping out into its own class 
    private Mapper mapper; 

    @Override 
    public Collection<DataThings> getThings(Identifier id){ 
     DatabaseQueryResult queryResult = //Code to hit a database and return objects from that domain model 
     Collection<DataThings> result = mapper.mapFromDatabaseToServiceDomain(queryResult); 
     return result; 
    } 
} 

그런 다음 우리는 우리의 매퍼가 있습니다. 우리는 서비스를 우리가 패키지 개인 가시성을 사용할 수 있도록 내부적으로 작동 걱정하는 패키지 외부 사람이 필요하지 않습니다 우리는이 작업 수행에 원하는대로 우리는 많은 클래스를 가질 수 있습니다

class Mapper { 
    Collection<DataThings> mapFromDatabaseToServiceDomain(DatabaseQueryResult queryResult){ 
     //magic to map objects goes here 
    } 
} 

우리가 가진 장점 그러나 우리는 항상이 Mapper 클래스를 변경할 수 있지만, 우리가 원하거나 삭제하거나 새로운 패키지 개인 클래스를 생성 할 수 있으며, 우리는이 패키지 안에있는 유일한 (즉각적인) 효과가 있음을 알고 있습니다. 즉각적인 효과는 컴파일러 오류와 심각한 문제를 의미합니다. 분명히 행동을 바꾸면 서비스를 중단 할 수는 있지만 자동화 된 테스트 스위트를 통해 잡을 수 있습니다. P