JAVA:对抽象静态方法的合理需求

JAVA:对抽象静态方法的合理需求,java,methods,interface,static,abstract,Java,Methods,Interface,Static,Abstract,长话短说,我有一个工具箱,里面有不同的工具。我想为每个工具实现一个类,该类必须实现一个被创造性地称为“工具”的公共接口。由于每个工具只是一组方法,因此没有理由创建该工具的实例,因此我希望这些方法是静态的。然而,由于这些方法是抽象的,它们不能是静态的 我希望能够做到这一点: RectangleTool.getCursor(); EllipseTool.getCursor(); (EllipseTool和RectangleTool是类名) 我觉得这是对抽象静态方法的合理使用。然而,我意识到这在Ja

长话短说,我有一个工具箱,里面有不同的工具。我想为每个工具实现一个类,该类必须实现一个被创造性地称为“工具”的公共接口。由于每个工具只是一组方法,因此没有理由创建该工具的实例,因此我希望这些方法是静态的。然而,由于这些方法是抽象的,它们不能是静态的

我希望能够做到这一点:

RectangleTool.getCursor();
EllipseTool.getCursor();
(EllipseTool和RectangleTool是类名)

我觉得这是对抽象静态方法的合理使用。然而,我意识到这在Java中是不可能的

我看得不对吗?我意识到我可以实例化每个对象的单个对象,但我不喜欢它的语义


说服我有更好的方法来理解这一点。

你的抽象静态方法没有任何用处。由于静态方法需要在定义它们的类上直接调用,因此它们在基类中是抽象的,因此不存在间接层

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


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

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

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
);
Tool tool1=RectangleTool.INSTANCE.getCursor();
List toolbox=ImmutableList.of(
矩形工具.INSTANCE,
EllipseTool.INSTANCE,
SquareTool.INSTANCE,
CircleTool.INSTANCE
);

几乎所有静态方法的变通方法:依赖项注入。这些可能重复的注释的可能重复非常烦人。我明白了,在另一个线程中有一个解决方法。我试图为我目前的情况辩护,为什么Java的下一个版本应该允许抽象静态方法。我猜我的标题有误导性。@ReX357如果你想在未来的Java版本中为这一功能辩护,写一篇博客,跳上Java邮件列表,或者在一个有利于辩论的公告板上发表文章,如果你想用Java来解决这个“问题”——就像今天一样——那么请注意“重复评论”。@user2864740好吧,这很公平。谢谢。所以我不能将变量定义为Tool=RectangleTool.class;然后调用tool.getCursor()?您确实不能,因为
矩形工具.class
,而不是
工具
。这很公平。谢谢接受。请记住,这正是我所说的“静态方法的多态性”。谢谢。这正是我在接受答案后去的地方。我要用单身汉。你在上面的例子对我没有用,因为我有一个ngonTool。矩形工具是为了方便起见,因为创建不同尺寸的矩形是很常见的。ngon工具仅创建等边多边形。但我知道你要去哪里了。