包装可见性 [英] package visibility

查看:114
本文介绍了包装可见性的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

Why use package visibility (the default), unless the class should be public in java

推荐答案

如Rostislav Matl所说,当您要制作不属于包接口一部分的内容时,它很有用.

As Rostislav Matl said, it's useful for when you want to make something that doesn't form part of your package's interface.

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

As an example, imagine you have a package and it provides an interface and at least one concrete implementation of a service.

使用此服务的人们将在乎您提供的接口,并使用您提供的具体类之一,但他们将不关心除此以外的其他内容.我们的服务必须与数据库进行对话,并且它必须能够将数据库查询的结果映射到其自己的数据类型(构成合同).

People who use this service are going to care about the interface you provide and use one of the concrete classes you provide but they aren't going to care about much else beyond that. Our service has to talk to a database and it needs to be able to map the result from database queries into its own data type (that form its contract).

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

I find that I regularly create package private helper classes that contain utility type methods or perform tasks like the mapping that we need. Default (package private) visibility is perfect for this because other classes inside your package can use these helpers but no-one outside the package can see them so you're free to change them whenever you like.

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

This is a an example using some code:

我们有我们的界面:

public interface UsefulService {
    Collection<DataThings> getThings(Identifier id);
}

...以及我们的具体实现:

...and our concrete implementation:

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

然后我们有了映射器.我们不需要包外的任何人来关心服务在内部的工作,因此我们使用包私有可见性,并且我们可以有尽可能多的类来完成工作:

Then we have our mapper. We don't need anyone outside the package to care about the service works internally so we use package private visibility and we can have as many classes as we want to get the job done:

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

我们拥有的好处是,我们总是可以更改此Mapper类,但是我们想要或删除它,或者创建新的包私有类,并且我们知道可以引起的唯一(即刻)影响就在此包内.所谓即时效果,是指编译器错误和诸如此类的严重问题.显然,如果更改其行为,则可能会中断服务,但这就是您的自动化测试套件所要抓住的:P

The benefit that we have is that we can always change this Mapper class however we want or delete it or create new package private classes and we know the only (immediate) effects we can cause are inside this package. By immediate effects I mean compiler errors and serious things like that. Obviously you could break your service if you change its behaviour but that's what your automated test suite is there to catch :P

这篇关于包装可见性的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆