包装可见性

时间:2011-03-29 11:32:52

标签: java package visibility abstraction

为什么要使用包可见性(默认值),除非该类在java中是公共的

3 个答案:

答案 0 :(得分:9)

正如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;
    }
}

然后我们有了mapper。我们不需要包外的任何人来关心内部的服务工作,所以我们使用包私有可见性,我们可以拥有尽可能多的类来完成工作:

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

我们的好处是我们可以随时更改此Mapper类,但我们想要或删除它或创建新的包私有类,我们知道我们可以在此包中产生的唯一(立即)效果。通过即时效应,我的意思是编译器错误和类似的严重事情。显然,如果你改变它的行为,你可能会破坏你的服务,但这就是你的自动化测试套件要捕获的:P

答案 1 :(得分:4)

我的理解是打包/默认访问是针对包内部的,即不构成包接口的类,即不应在包外使用的类。

答案 2 :(得分:0)

您通过default修饰符获得的内容,即没有任何访问修饰符(即公共私有或受保护),这意味着它对特定包中的所有人都可见。因此,当您希望只能在自己的包中访问您的类时,您应该使用default

了解详情:Controlling Access