Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 包可见性_Java_Package_Visibility_Abstraction - Fatal编程技术网

Java 包可见性

Java 包可见性,java,package,visibility,abstraction,Java,Package,Visibility,Abstraction,为什么要使用包可见性(默认),除非类在java中是公共的我的理解是包/默认访问是针对包内部的,即不构成包接口的类,即不应在包外部使用的类。正如Rostislav Matl所说,当您想要制作一些不构成包接口一部分的东西时,它非常有用 例如,假设您有一个包,它提供了一个接口和服务的至少一个具体实现 使用此服务的人会关心您提供的接口,并使用您提供的一个具体类,但除此之外,他们不会关心太多其他问题。我们的服务必须与数据库通信,并且它需要能够将数据库查询的结果映射到它自己的数据类型(形成它的合同) 我发现

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

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

正如Rostislav Matl所说,当您想要制作一些不构成包接口一部分的东西时,它非常有用

例如,假设您有一个包,它提供了一个接口和服务的至少一个具体实现

使用此服务的人会关心您提供的接口,并使用您提供的一个具体类,但除此之外,他们不会关心太多其他问题。我们的服务必须与数据库通信,并且它需要能够将数据库查询的结果映射到它自己的数据类型(形成它的合同)

我发现我经常创建包私有助手类,这些类包含实用程序类型的方法或执行我们需要的映射之类的任务。默认(包私有)可见性非常适合于此,因为包内的其他类可以使用这些帮助程序,但包外的任何人都看不到它们,所以您可以随时更改它们

这是一个使用一些代码的示例:

我们有自己的界面:

public interface UsefulService {
    Collection<DataThings> getThings(Identifier id);
}
公共接口可用服务{
集合getThings(标识符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;
    }
}
公共类JdbcUsefulServiceImpl实现UsefulService{
//我们可以将映射的代码分解为它自己的类
私人制图员;
@凌驾
公共集合获取内容(标识符id){
DatabaseQueryResult queryResult=//命中数据库并从该域模型返回对象的代码
收集结果=mapper.mapFromDatabaseToServiceDomain(queryResult);
返回结果;
}
}
然后我们有了地图绘制者。我们不需要包外的任何人关心服务的内部工作,因此我们使用包私有可见性,并且我们可以拥有我们想要完成工作的任意多个类:

class Mapper {
    Collection<DataThings> mapFromDatabaseToServiceDomain(DatabaseQueryResult queryResult){
        //magic to map objects goes here
    }
}
类映射器{
从数据库到服务域的集合映射(DatabaseQueryResult queryResult){
//映射对象的魔力就在这里
}
}

我们所拥有的好处是,我们可以随时更改这个映射器类,不管我们想要什么,或者删除它,或者创建新的包私有类,并且我们知道我们可以造成的唯一(即时)影响是在这个包内。我所说的即时效应是指编译器错误和类似的严重问题。显然,如果您改变服务的行为,您可能会中断服务,但这正是您的自动测试套件要解决的问题:P

阅读一些背景知识会有所帮助,例如第5章。这些都是以前编写的。对于接口,默认可见性为public。;)