包可见性

9

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


1
阅读一些背景资料会有所帮助,例如《Java编程思想》第5章。这些都是之前写过的。 - Jean-François Corbett
1
对于接口,默认可见性为public。 ;) - Peter Lawrey
2个回答

11

正如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)。我们不需要让包外的任何人关心服务内部的工作,因此我们使用包私有(package private)可见性,并且我们可以拥有尽可能多的类来完成工作:

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

我们的好处在于,我们可以随心所欲地修改这个Mapper类,或是删除它,或是创建新的包内私有类。我们知道,我们能够造成的唯一(直接)影响只存在于该包内。所谓直接影响是指编译器错误和严重的问题等。当然,如果您改变了其行为,可能会破坏您的服务,但这就是您的自动化测试套件的作用啦:P


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

好的,这就是为什么它被称为“包私有”;-) - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接