【发布时间】:2011-07-25 05:11:50
【问题描述】:
为什么要使用包可见性(默认),除非该类在 java 中应该是公共的
【问题讨论】:
-
阅读一些背景知识会有所帮助,例如Thinking In Java第5章。这都是以前写过的。
-
对于接口,默认可见性是公开的。 ;)
标签: java package visibility abstraction
为什么要使用包可见性(默认),除非该类在 java 中应该是公共的
【问题讨论】:
标签: java package visibility abstraction
正如 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
【讨论】:
我的理解是包/默认访问是针对包内部的,即不形成包接口的类,即不应在包外使用的类。
【讨论】: