为什么要使用包可见性(默认值),除非该类在java中是公共的
答案 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