我的任务是创建一个可重用的软件作为库/ API。现在我在多个包中将每个类都公开,并且其中的方法大多是私有的。
由于这应该是一个API,我希望隐藏所有类,除了暴露一些类和方法。
我不能在类中使用private修饰符,因为我在项目的其他包中引用它们。我也不想为了访问其中的方法而不必要地继承这些类。
在保持在项目中访问它们的能力的同时,我应该怎么做才能公开某些类和方法?
答案 0 :(得分:3)
我真的建议您在开始设计API之前在一张纸上列出以下内容。
前期工作
您是否确定了所有类型的互动实体。每个实体都可以形成一个对象。
您希望使用哪一层(Controller / Facade / DAO等)。
是否有任何对象需要通过网络传输。
您的整个API将展示哪些数据。
<强>设计强>
您通常希望执行以下操作: -
如果您的实体(在第1部分中)是相关的并且可能包含公共信息,请创建1个实体(示例Common
)以保留公共数据(如请求的时间戳,设备信息等)并使其他人可以包含此信息info,继承这个实体。确保将公共实体的属性保护为受保护。
Common会看起来像
public class Common{
protected _deviceId;
protected _reqTimeStamp;
protected _osVersion;
//Getters and Setters.
}
例如,如果API使用从Mobile Apps收到的JSON请求数据,您可以让Common包含上面第1点中给出的数据。您可以创建另一个Object,如下所示
public class UserInfo extends Common{
private String _userName;
private String _userMailId;
//getters and setters
}
尝试在图层之间保留数据传输的最小实体。如果您的API所服务的服务层位于不同的服务器上,那么您可能希望将其保持序列化并确保此类DTO不包含大量信息。
同样,当您分离API的功能时,请尝试查看哪些功能类似且通常需要。将它们移动到抽象类并使实现到接口,对其他行为进行分类扩展抽象类。
请参阅下面的示例。
public abstract class CommonBehaviour {
protected String _commonId;
public void commonBehaviourOne()
{
//Behaviour common to implementations
}
abstract public void overrideThisBehaviour();
//getters and setters
}
现在,如果您在实现中有两种类型的行为,它们之间具有共同的功能。
public interface Designable {
}
public class DesignerImpl extends CommonBehaviour implements Designable {
@Override
public void overrideThisBehaviour() {
// TODO Auto-generated method stub
}
}
一旦清除了先决条件,就可以轻松地将类设置为public,private或default。你必须集体讨论,在利益相关者之间进行讨论并再次进行头脑风暴。你一定会想出一个好的API
参考帮助
互联网上有大量有关进入设计的人可以获得的信息。 就书籍而言,我提到了“Head First Design Patterns”和Design Patterns by Gamma。虽然我发现Gamma更全面,但前者对新手有好处。
如果这有助于您,请告诉我。
答案 1 :(得分:1)
在API上,您应该只公开接口和业务对象。通常,这些都是在接口实现上的不同maven工件上。
简而言之:为域对象创建一个maven项目,为API接口创建另一个项目,为API实现创建另一个项目。然后只向前面的客户分发前两个。
关于依赖项:实现项目应该依赖于API和业务对象项目。 API项目应仅依赖于业务对象项目。业务对象项目应该都不依赖于两者。
答案 2 :(得分:1)
如果您有要公开的方法,请将您的课程设为公开课程。 在其类中本地使用的方法必须是私有的 应该暴露的方法公开 应该在API中可见而不是out的方法需要受保护或默认。