这更多是一个架构问题。我想在我的项目中有一个全局对象,每个类都可以访问该对象,但是需要每次创建一个实例时都不需要。对象本身是不同服务的组合。我的第一种方法是定义一个接口,在该接口中实例化对象,然后只需说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这样的依赖注入框架。正是您所需要的东西很好-具有其他类可以访问的全局对象。它还使测试变得更加容易,并使您能够快速更改应使用的全局对象。

07-24 09:45
查看更多