我心里有一个无法解决的困境。 在这种情况下,我应该在方法参数中还是在父构造函数中传递对象吗?
第一个想法:
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
。
通过这样做,我们可以从 registerListener
和 registerListeners
等方法中删除一个参数。
所以代码看起来像这样:
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/