JAVA:对抽象静态方法的合理需求
JAVA: Legitimate need for an abstract static method
长话短说,我有一个包含不同工具的工具箱。我想为每个工具实现一个 class,并且 class 必须实现一个创造性地称为 "Tool" 的通用接口。由于每个工具只是一组方法,因此没有理由创建该工具的实例,因此我希望这些方法是静态的。但是,由于这些方法是抽象的,因此不能将它们设为静态。
我希望能够做到这一点:
RectangleTool.getCursor();
EllipseTool.getCursor();
(EllipseTool 和 RectangleTool 是 class 个名称)
我觉得这是对抽象静态方法的合法使用。但是,我意识到在 Java.
中是不可能的
我没看清楚吗?我意识到我可以实例化每个对象的单个对象,但我不喜欢它的语义。
说服我有更好的方法来查看这个。
您的抽象静态方法将毫无用处。由于需要在定义它们的 class 上直接调用静态方法,因此在基础 class.
中抽象它们不会提供间接层
本质上,既然你已经确定你需要调用例如。 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
);
长话短说,我有一个包含不同工具的工具箱。我想为每个工具实现一个 class,并且 class 必须实现一个创造性地称为 "Tool" 的通用接口。由于每个工具只是一组方法,因此没有理由创建该工具的实例,因此我希望这些方法是静态的。但是,由于这些方法是抽象的,因此不能将它们设为静态。
我希望能够做到这一点:
RectangleTool.getCursor();
EllipseTool.getCursor();
(EllipseTool 和 RectangleTool 是 class 个名称)
我觉得这是对抽象静态方法的合法使用。但是,我意识到在 Java.
中是不可能的我没看清楚吗?我意识到我可以实例化每个对象的单个对象,但我不喜欢它的语义。
说服我有更好的方法来查看这个。
您的抽象静态方法将毫无用处。由于需要在定义它们的 class 上直接调用静态方法,因此在基础 class.
中抽象它们不会提供间接层本质上,既然你已经确定你需要调用例如。 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
);