【问题标题】:JAVA: Legitimate need for an abstract static methodJAVA:对抽象静态方法的合法需求
【发布时间】:2015-05-26 01:11:01
【问题描述】:

长话短说,我有一个包含不同工具的工具箱。我想为每个工具实现一个类,并且该类必须实现一个创造性地称为“工具”的通用接口。由于每个工具只是一组方法,因此没有理由创建工具的实例,因此我希望这些方法是静态的。但是,由于这些方法是抽象的,因此不能将它们设为静态。

我希望能够做到这一点:

RectangleTool.getCursor();
EllipseTool.getCursor();

(EllipseTool 和 RectangleTool 是类名)

我觉得这是抽象静态方法的合法用途。但是,我意识到这在 Java 中是不可能的。

我没有正确看到这个吗?我意识到我可以实例化每个对象的单个对象,但我不喜欢它的语义。

说服我有更好的方法来查看这个。

【问题讨论】:

  • [几乎]所有静态方法的解决方法:依赖注入。
  • 这些可能重复的 cmets 太烦人了。我明白了,在不同的线程中有一个解决方法。我试图为我目前的情况争论为什么下一个版本的 Java 应该允许抽象静态方法。我猜我的标题有误导性。
  • @ReX357 如果你想在未来的 Java 版本中为这样的特性提出论据,写一篇博客,加入 Java 邮件列表,或者在一个辩论友好的公告板上发帖,例如。如果您想要一个可行的解决方案来解决 Java 中的这个“问题”——就像今天一样——那么请注意“重复的 cmets”。
  • @user2864740 好的,很公平。谢谢。

标签: java methods interface static abstract


【解决方案1】:

您的抽象静态方法将毫无用处。由于需要在定义它们的类上直接调用静态方法,因此它们在基类中是抽象的,因此没有间接层。

本质上,因为您已经确定需要调用例如。 RectangleTool.getCursor()EllipseTool.getCursor()Tool.getCursor() 的存在没有区别,因为无论如何代码的任何部分都不能直接引用它。

当然,如果 Java 支持静态方法的多态性,那将是另一回事,但它不支持。

【讨论】:

  • 所以我无法将变量定义为 Tool tool = RectangleTool.class;然后调用 tool.getCursor()?
  • 你确实不能,因为RectangleTool.classClass,而不是Tool
  • 很公平。谢谢。接受。
  • 为了记录,这正是我所说的“静态方法的多态性”的意思。
【解决方案2】:

我建议在这里放弃需要静态方法可能是更好的设计。
如果不使用反射来调用它们,就不可能在工具上使用静态方法。 但是,除此之外,以这种方式限制自己可能会消除未来编写参数化工具或在工具之间重用代码的可能性。我不知道你的情况的全部范围,但想象一下这样的事情:

Tool pentagonTool = ShapeTools.regularPolygonWithEdges(5);
Tool triangleTool = ShapeTools.regularPolygonWithEdges(3);

我建议您摆脱对静态方法的要求,对于只有方法的工具实现,将这些实现设为单例。

Tool tool1 = RectangleTool.INSTANCE.getCursor();
List<Tool> toolbox = ImmutableList.of(
    RectangleTool.INSTANCE,
    EllipseTool.INSTANCE,
    SquareTool.INSTANCE,
    CircleTool.INSTANCE
);

【讨论】:

  • 谢谢。这正是我接受答案后去的地方。将使用单例。因为我有一个 ngonTool,所以您在顶部的示例对我没有用。矩形工具是为了方便起见,因为创建不同尺寸的矩形是很常见的事情。 ngon 工具仅创建等边多边形。但我知道你打算用它去哪里。
猜你喜欢
  • 2012-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-19
  • 2011-03-17
  • 2016-12-14
  • 1970-01-01
  • 2011-02-25
相关资源
最近更新 更多