这更多是一个架构问题。我想在我的项目中有一个全局对象,每个类都可以访问该对象,但是需要每次创建一个实例时都不需要。对象本身是不同服务的组合。我的第一种方法是定义一个接口,在该接口中实例化对象,然后只需说implements
就可以将其注入到每个类中。我想知道的是,这种方法是干净的还是有点古怪的,还是真的很粗糙。
到目前为止,这是我的实现:
public final class SystemServices
{
private final SecurityService securityService;
private final PersistencyService persistencyService;
private final RecordService recordService;
private final DispatcherService dispatcherService;
private SystemServices(Builder builder)
{
this.securityService = builder.securityService;
this.persistencyService = builder.persistencyService;
this.recordService = builder.recordService;
this.dispatcherService = builder.dispatcherService;
}
public SecurityService getSecurityService()
{
return securityService;
}
public PersistencyService getPersistencyService()
{
return persistencyService;
}
public RecordService getRecordService()
{
return recordService;
}
public DispatcherService getDispatcherService()
{
return dispatcherService;
}
public static class Builder
{
private SecurityService securityService;
private PersistencyService persistencyService;
private RecordService recordService;
private DispatcherService dispatcherService;
public Builder setSecurityService(SecurityService securityService)
{
this.securityService = securityService;
return this;
}
public Builder setPersistencyService(PersistencyService persistencyService)
{
this.persistencyService = persistencyService;
return this;
}
public Builder setRecordService(RecordService recordService)
{
this.recordService = recordService;
return this;
}
public Builder setDispatcherService(DispatcherService dispatcherService)
{
this.dispatcherService = dispatcherService;
return this;
}
public SystemServices build()
{
return new SystemServices(this);
}
}
}
这是在其中创建SystemServices实例的接口:
public interface ServiceProvider
{
public static SystemServices systemServices = new SystemServices.Builder()
.setSecurityService(new SecurityService())
.setPersistencyService(new PersistencyService(new BlackBoxDb(BlackboxApplication.getAppContext())))
.setRecordService(new RecordService()).setDispatcherService(new DispatcherService()).build();
}
现在,我只需使用
systemServices.getSecurityService.doSomethingSecurityRelated()
即可访问每个类中的对象该代码有效,对我来说对于初学者来说似乎太好了,但是我敢肯定这种方法有些丑陋。因此,任何批评表示赞赏:)
JVM如何处理接口也将很有趣。它真的只是一个单一的(吨)对象还是为每个类创建一个对象?
最佳答案
JVM会像您想要的那样处理接口,只会创建一个SystemServices。
但是您描述的方法确实被认为是“丑陋的”。我认为最好的方法是使用像Spring这样的依赖注入框架。正是您所需要的东西很好-具有其他类可以访问的全局对象。它还使测试变得更加容易,并使您能够快速更改应使用的全局对象。