我正在写一个关于Twisty Puzzles的应用程序:魔方、Pyramix、Skewb等等。我有一个抽象类"TwistyPuzzle"和派生类:TwistyCube、TwistyPyramix等。我有一个对话框,它提供了每个谜题的基本信息:它的名字,发明者,发明年份,谜题如何工作的基本描述。
关于每个谜题的信息最好保存在每个"实现"类TwistyCube、TwistyPyramix等中。静态方法迫使自己:
class TwistyCube extends TwistyPuzzle
static String getName()
{
return "Rubik Cube";
}
但是似乎没有办法让需要显示这些信息的Dialog查询类,因为Java中没有"抽象静态"方法的概念。
那么我有什么选择呢?Java中缺少"抽象静态"的标准解决方法是什么?
正如您所指出的,您不能声明abstract static
方法(或字段(。
这不仅仅是语法。根本原因是Javastatic
成员不是继承的。这意味着static
成员通常不能被多晶型地使用。当调用static
方法或访问static
字段时,调用/使用哪个类成员的决定在编译时仅根据编译时类型考虑因素确定。
所以。。。大体上你想做的事是做不到的。
但有一个解决方案。如果要在方法上使用abstract
,请将其声明为实例方法。无论你这样做是为了让你可以多形态地使用这个方法。。。或者由于其它原因。
你反对说:
这样的方法应该是非静态的,因为您总是在实例上调用它。–Thomas 2小时前
当然不是-"TwistyRubik"的所有实例的名称都是相同的。它显然属于类,而不是它的实例Ralf Kleberhoff 1小时前
但我认为你没有抓住要点。方法不会";归属;到实例。方法属于类。甚至是非静态方法。我们称之为非静态方法";实例";方法,因为它们通常对特定实例的状态进行操作。但他们不需要。实例方法可以返回它所属类的信息。
以下是我如何写你的例子:
public abstract class TwistyPuzzle {
public abstract String getName();
...
}
public class TwistyCube extends TwistyPuzzle
public String getName();
return "Rubik Cube";
}
...
}
让我们来分析一下:
Q:它是否具有所需的行为
A:是的。每个TwistyCube
实例都将返回"Rubik Cube"
。Q: 将其作为一种非静态方法是否有任何空间开销
A:No。方法代码是共享的,由于Java不将方法视为实例的可更新属性,因此没有每个对象的存储开销。Q: 将其作为非静态方法是否会带来性能开销
A:在大多数情况下不会。如果有开销,那么它是最小的。Q: 与
static
方法相比有优势吗
A:是的。getName()
可以与运行时方法调度一起使用。
那么这里的实际问题是什么?什么是";归属;意思是
坦率地说,我认为这只是你概念化实例方法的方式。在实例上调用方法并不意味着它需要返回特定于该实例的信息。
把Java想象成一种工具。按照设计使用方式使用它。如果您想要传递有关当前Java类的信息的abstract
(例如多态(方法,那么这是标准方法。
跟进
用一个单独的枚举(每种类型的
TwistyPuzzle
一个值(来提供这样的信息怎么样?
我想这会奏效的。但是现在您遇到的问题是获取与您正在查询的特定TwistyPuzzle
实例(或类(相关的正确enum
值。与生活在单独类中的每个TwistyPuzzle
类相关的信息存在可读性/可维护性问题;即CCD_ 16。