【问题标题】:Use Java methods in multiple classes在多个类中使用 Java 方法
【发布时间】:2014-08-18 00:31:42
【问题描述】:

我知道这个问题已经被问过一百万次了,但我找不到合适的答案。

我有一堆信使方法,如debug(String)tell(CommandSender, String),我想使用各种类。这听起来简单易行,但 Java 缺乏对多重继承的支持,这使得对于已经必须扩展其他内容的类来说,这个问题变得异常困难。

据我所知,接口不起作用,因为接口不允许您实际实现放入其中的方法。

我曾考虑向该方法添加额外的参数,以使它们在静态实用程序类中工作,但这会使对方法的调用从 debug(String) 变为 MessageUtil.debug(Plugin, String),这比我想要的要庞大得多。

我考虑过制作一个可以处理这些消息的 Messenger 对象,这样我就可以调用messenger.debug(String),这样更好,但我无法摆脱这样的感觉,即必须有更好的方法来单独获取debug(String)

有什么建议吗?

编辑: 不幸的是,如果不添加额外的参数,这些方法就不能成为静态的;因此,静态导入将不起作用。

编辑: 这是我尝试在多个类中使用的方法之一的示例。正如你所看到的,它使用“plugin”和“debuggers”等非静态全局变量,它不能被设为静态。

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() 方法实际上不是静态的;那是一个复制粘贴错误。我已经对其进行了修改以反映这一点。

【问题讨论】:

  • 如果您发现缺少类的多重继承是个问题,那么您应该认真检查一下您的类层次结构。在大多数情况下,多重继承不应该是您在 Java 中依赖/需要的东西。
  • 您建议我如何修改它以避免多重继承?我不想依赖多重继承(因为我不能使用它),但我不知道另一种好方法。
  • 组合优于继承。
  • 你反对静态导入吗?
  • 好吧broadcast() 可以是静态导入。您的 debug() 方法似乎有很多状态。将 MessageUtil 实例传递给您的调用者,或使用 Singleton。

标签: java class inheritance multiple-inheritance


【解决方案1】:

据我所知,接口不起作用,因为接口不允许您实际实现放入其中的方法。

看看 Java 8 的一项新功能:default methods in interface。也许你可以用这个做点什么。

【讨论】:

  • 我确实看到了,这正是我所需要的。但是,这是一个为与预先存在的 Java 程序一起工作而编写的插件,我认为它不支持 Java 8。我会做更多的研究,看看我是否可以让它与 Java 8 一起工作。如果他们确实支持 Java 8,那么这将是完美的。
  • @REALDrummer 这实际上与静态导入解决方案没有什么不同(除非您打算覆盖它们)。我不明白这对您有何帮助,因为您提到您使用了接口和默认方法无法帮助您的非静态全局变量。正如 cmets 中提到的,组合是最好的方法,或者使用单例。
  • @ggovan 使用默认方法,我可以创建一个包含所有全局变量和静态方法的类,这些方法采用我不想一直使用的额外参数。然后,我可以使用使用这些静态方法的默认方法创建一个接口,但将类中的全局变量作为所需的额外参数传递。然后我想要的所有类都可以实现该接口,并拥有所有没有额外参数和组合的方法。这不是最漂亮的解决方案,但它确实有效。
  • @ggovan 哦,这不适用于静态导入,因为我想使用的方法不能是静态的。我正在使用具有总体 A.P.I. 的插件界面工作。有很多事情应该是不变的,但可能不是。这一切都非常复杂和奇怪,但这意味着我不能让这些方法成为静态的,不幸的是。
【解决方案2】:

给定

这使得对方法的调用从 debug(String) 转到 MessageUtil.debug(Plugin, String),这比我想要的要庞大得多。

假设您的方法是静态的,或者可以设为静态,您可以使用static import -

import static mypackage.MessageUtil.debug;

//
debug("Hello");

【讨论】:

  • 这是个好主意,但不幸的是,它在这里行不通。如果不添加越来越多的参数,我无法使方法成为静态的。我确实对其他可以设为静态的东西使用了静态导入,但这在这里不起作用。
  • @REALDrummer 请编辑您的问题,您的意思是单独获得debug(String)的更好方法? debug(String) 是做什么的?
  • @ElliottFrisch OP 在问题 cmets 中评论了这些方法的功能
  • @ElliottFrisch 我编辑问题以反映这一点。 debug(String) 旨在将给定的消息(字符串)发送给当前处于“调试模式”的任何人,而不是其他任何人。
猜你喜欢
  • 2011-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-29
  • 1970-01-01
  • 2011-05-22
  • 2022-08-02
  • 2012-09-15
相关资源
最近更新 更多