我知道这个问题已被问了一百万次,但我找不到合适的答案。
我有一些信使方法,如debug(String)
和tell(CommandSender, String)
,我想使用各种类。这听起来简单易行,但是Java缺乏对多重继承的支持,这使得那些已经不得不扩展其他内容的类非常困难。
接口在我所知的范围内不会起作用,因为接口不允许你实际实现你放入它们的方法。
我考虑过为方法添加额外的参数,使它们可以从静态实用程序类中运行,但是这使得对方法的调用从debug(String)
变为MessageUtil.debug(Plugin, String)
,这比我的体积要大得多我想。
我考虑过制作一个可以处理这些消息的Messenger对象,以便我可以调用messenger.debug(String)
,这样会更好,但是我无法理解必须有更好的方法来获取debug(String)
单独{1}}。
有什么建议吗?
编辑: 遗憾的是,如果不添加额外的参数,这些方法就不能成为静态的。因此,静态导入将无法正常工作。
编辑: 以下是我尝试在多个类中使用的方法之一的示例。正如你可以看到它使用非静态全局变量,如"插件"和"调试器",它不能是静态的。
protected myPlugin plugin;
private myList<String> debuggers = new myList<String>();
public void debug(String message) {
if (debuggers.size() == 0)
return;
if (debuggers.contains("\\console")) {
plugin.getServer().getConsoleSender().sendMessage(plugin.getColor() + message);
if (debuggers.size() == 1)
return;
}
for (Player player : plugin.getServer().getOnlinePlayers())
if (debuggers.contains(player.getName()))
player.sendMessage(plugin.getColor() + message);
}
这是另一个使用与上面相同的全局变量向服务器上的每个播放器和控制台播放消息的示例:
public void broadcast(String message) {
for (Player player : mCL.getServer().getOnlinePlayers())
player.sendMessage(plugin.getColor() + message);
mCL.getServer().getConsoleSender().sendMessage(message);
}
编辑:上面的broadcast()
方法实际上并不是静态的;这是一个复制粘贴错误。我修改了它以反映这一点。
答案 0 :(得分:6)
鉴于
这使得对方法的调用从debug(String)变为MessageUtil.debug(Plugin,String),这比我想要的要大得多。
假设您的方法是静态的,或者可以是静态的,您可以使用static import
-
import static mypackage.MessageUtil.debug;
//
debug("Hello");
答案 1 :(得分:1)
接口在我所知的范围内不会起作用,因为接口不允许你实际实现你放入它们的方法。
查看Java 8的新功能之一:default methods in interface。也许你可以用这个做点什么。