Java:无“抽象静态”的变通方法
我正在写一个关于扭曲拼图的应用程序:魔方、皮拉米克斯、Skewb等等。 我有一个抽象类“TwistyPuzzle”和派生类:TwistyCube、TwistyPyraminx等。 我有一个对话框,提供了每个拼图的基本信息:它的名字、发明者、发明年份、拼图工作原理的基本描述
关于每个谜题的信息最好保存在每个“实现”类TwistyCube、TwistyPyraminx等中。静态方法强制自己:
class TwistyCube extends TwistyPuzzle
static String getName()
{
return "Rubik Cube";
}
但似乎没有办法让需要显示这些信息的对话框查询类,因为Java中没有“抽象静态”方法的概念
那么我有什么选择呢?Java中缺少“抽象静态”的标准解决方法是什么
# 1 楼答案
正如您所指出的,您不能声明
abstract static
方法(或字段)这不仅仅是语法。根本原因是Java
static
成员不是继承的。这意味着static
成员通常不能多态使用。当您调用static
方法或访问static
字段时,调用/使用哪个类成员的决定在编译时确定,完全基于编译时类型的考虑所以。。。大体上你想做的事做不到
但有一个解决办法。如果要在方法上使用
abstract
,请将其声明为实例方法。无论你这样做是为了让你可以多态地使用这个方法。。。或者其他原因你反驳说:
但我认为你没有抓住重点。方法不“属于”实例。方法属于类。即使是非静态方法。我们称非静态方法为“实例”方法,因为它们通常对特定实例的状态进行操作。但他们不需要这么做。实例方法可以返回关于它所属类的信息
下面是我将如何编写您的示例:
让我们来分析一下:
问:它是否具有所需的行为<是的。每个
TwistyCube
实例都将返回"Rubik Cube"
问:让这成为一个非静态的方法有没有空间开销
答:不。方法代码是共享的,而且由于Java不将方法视为实例的可更新属性,因此没有每个对象的存储开销
问:将其作为一种非静态方法是否会带来性能开销
答:在大多数情况下不会。如果有开销,那么它是最小的
问:与
static
方法相比,有什么优势吗<是的。getName()
可以多态地与运行时方法调度一起使用那么这里的实际问题是什么?“归属”是什么意思
坦率地说,我认为这只是你概念化实例方法的方式。对实例调用方法并不意味着它需要返回特定于该实例的信息
把Java看作一种工具。按照设计的方式使用它。如果您想要
abstract
(例如多态)方法来传递有关当前Java类的信息,那么这是标准的方法跟进
我想那会管用的。但是现在,您遇到了一个问题,即获取与您正在查询的特定
TwistyPuzzle
实例(或类)相关的正确enum
值。而且你有一个可读性/可维护性问题,与生活在一个单独的类中的每个TwistyPuzzle
类有关的信息;i、 e.enum