java - 我应该在方法参数中还是在 Java 的父构造函数中传递对象

标签 java oop dependency-injection guice discord-jda

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

第一个想法:

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

最佳答案

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

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

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

更新:

在我看来,如果方法 registerListener(ListenerAdapterlistenerAdapter) 位于 TempChannelsPlugin 类,那么第二个选项作为 vatiable private JDA client; 的范围是整个类。 所以不需要声明不必要的参数。

我会将 JDA 客户端 模式依赖于 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);
    }
}   

关于java - 我应该在方法参数中还是在 Java 的父构造函数中传递对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73535761/

相关文章:

java - 在 Netbeans 中添加监听器

javascript - 在 xbl/xul 文件中加载 javascript 模块的正确方法是什么?

java - 加载图像作为资源返回 null

java - Android PCM转Ulaw编码wav文件

java - 如何使用在方法内部定义的变量在java中同一类的另一个方法中使用方法外部

javascript - 在 Javascript 中编程 OOP - 正确地

angularjs - 在 AngularJS 中以编程方式在运行时替换服务

android - Dagger 无法注入(inject)类型参数字段

Java 8 流 HashMap<String, ArrayList<String>> 到 SortedMap<String, Integer>

用于教学的Java开源项目