总而言之,我有一个带有不同工具的工具箱。我想为每个工具实现一个类,并且该类必须实现一个创造性地称为" Tool"的通用接口。由于每个工具只是一组方法,因此没有理由创建工具的实例,因此我希望这些方法是静态的。然而,由于这些方法是抽象的,所以它们不能是静态的。
我希望能够做到这一点:
RectangleTool.getCursor();
EllipseTool.getCursor();
(EllipseTool和RectangleTool是类名)
我觉得这是抽象静态方法的合法用法。但是,我意识到这在Java中是不可能的。
我没有看到这个吗?我意识到我可以实例化每个对象,但我不喜欢它的语义。
说服我有一种更好的方法可以看到这一点。
答案 0 :(得分:1)
您的抽象静态方法没有用处。由于静态方法需要直接在定义它们的类上调用,因此没有任何间接层可供它们在基类中抽象使用。
从本质上讲,既然您已经确定需要打电话,例如。 RectangleTool.getCursor()
或EllipseTool.getCursor()
,Tool.getCursor()
的存在没有任何区别,因为代码的任何部分都无法直接引用它。
当然,如果Java支持静态方法的多态性,那将是另一回事,但事实并非如此。
答案 1 :(得分:1)
我建议在这里放弃想要的静态方法可能是更好的设计 如果不使用反射来调用它们,就不可能在工具上使用静态方法。 但是,除此之外,以这种方式限制自己可能会消除编写参数化工具或在工具之间重用代码的未来可能性。我不知道你的情况的全部范围,但想象一下这样的事情:
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
);