【问题标题】:Should I pass object in method parameter or in parent constructor in Java我应该在方法参数中传递对象还是在Java的父构造函数中传递对象
【发布时间】:2022-08-31 13:56:52
【问题描述】:

我有一个我无法解决的困境。 在这种情况下,我应该在方法参数或父构造函数中传递对象吗?

第一个想法:

public class TempChannelsPlugin extends JolssyPlugin {

    private JDA client;
    private TempChannelsListener listener;
    private JdaCommandManager jdaCommandManager;

    @Inject
    public TempChannelsPlugin(JDA client, JdaCommandManager jdaCommandManager, TempChannelsListener listener) {
        super(Category.UTILITIES, "Temporary Channels");

        this.client = client;
        this.jdaCommandManager = jdaCommandManager;
        this.listener = listener;
    }


    @Override
    protected void setup() {
        this.registerListener(this.client, this.listener);
    }
}

在 JolssyPlugin 中:

protected void registerListener(JDA client, ListenerAdapter listenerAdapter) {
   this.registerListeners(client, listenerAdapter);
}

第二个想法:

public class TempChannelsPlugin extends JolssyPlugin {

    private JDA client;
    private TempChannelsListener listener;
    private JdaCommandManager jdaCommandManager;

    @Inject
    public TempChannelsPlugin(JDA client, JdaCommandManager jdaCommandManager, TempChannelsListener listener) {
        super(client, Category.UTILITIES, "Temporary Channels");

        this.jdaCommandManager = jdaCommandManager;
        this.listener = listener;
    }


    @Override
    protected void setup() {
        this.registerListener(this.listener);
    }
}

在 JolssyPlugin 中:

protected void registerListener(ListenerAdapter listenerAdapter) {
   this.registerListeners(this.client, listenerAdapter);
}

这两种情况有什么区别?为什么我应该支持一个案例而不是另一个案例?

请注意,我正在使用 Guice 进行 DI

【问题讨论】:

  • 也许您应该解释您对这两种方法的保留或担忧。

标签: java oop dependency-injection guice discord-jda


【解决方案1】:

在我看来,如果方法 registerListener(ListenerAdapter listenerAdapter) 位于 TempChannelsPlugin 类中:

protected void registerListener(ListenerAdapter listenerAdapter) {
   this.registerListeners(this.client, listenerAdapter);
}

那么第二个选项更好,因为 vatiable private JDA client; 具有整个班级的范围。所以不需要声明不必要的参数,因为我们可以在类TempChannelsPlugin 的任何地方使用private JDA client; 变量。

更新:

在我看来,如果方法registerListener(ListenerAdapter listenerAdapter) 位于TempChannelsPlugin 类,那么第二个选项更好,因为可变private JDA client; 具有整个类的范围。 所以不需要声明不必要的参数。

我会将JDA client 的依赖模式设置为JolssyPlugin,就像您在JolssyPlugin 中拥有registerListener 一样。 通过这样做,我们可以从registerListenerregisterListeners 等方法中删除一个参数。 所以代码看起来像这样:

public abstract class JolssyPlugin {

    protected Set<ListenerAdapter> listeners = new HashSet<>();

    protected JdaCommandManager jdaCommandManager;
    protected Category category;
    protected String name;
    private JDA jdaClient;

    public JolssyPlugin(Category category, String name, JDA jdaClient) {
        this.category = category;
        this.name = name;
        this.jdaClient = jdaClient;
    }
    
    protected abstract void setup();

    protected void registerListener( ListenerAdapter listenerAdapter) {
       this.registerListeners(client, listenerAdapter);
    }

    protected void registerListeners(ListenerAdapter... listenerAdapter) {
        List<ListenerAdapter> listeners = Arrays.asList(listenerAdapter);

        client.addEventListener(listeners);
        this.listeners.addAll(listeners);
    }
}   

【讨论】:

  • 感谢您的回答:D registerListener 位于 JolssyPlugin
  • @FlavioMoreno 你能展示一下JolssyPlugin 的完整代码吗?
  • @FlavioMoreno 请看我更新的答案
猜你喜欢
  • 2020-05-24
  • 2014-10-24
  • 1970-01-01
  • 2014-07-15
  • 2011-02-21
  • 2013-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多