Java:无'abstract static'的解决方法



我正在写一个关于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。

最新更新