微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Java:无“抽象静态”的解决方法

如何解决Java:无“抽象静态”的解决方法

我正在编写有关Twisty Puzzles的应用程序:Rubik Cube,Pyraminx,Skewb等。 我有一个抽象类'TwistyPuzzle'和派生类:TwistyCube,TwistyPyraminx等。 我有一个对话框,其中提供了有关每个难题的基本信息:它的名称,发明人,发明年份,难题的基本描述。

关于每个难题的信息-恕我直言-最好保存在TwistyCube,TwistyPyraminx等每个“实现”类中。静态方法会强制执行以下操作:

class TwistyCube extends TwistyPuzzle

static String getName()
  {
  return "Rubik Cube";
  }  

但是似乎没有办法显示需要显示此信息并查询类的对话框-因为Java中没有“静态抽象”方法的概念。

我有什么选择? Java中缺少“抽象静态”的标准解决方法是什么?

解决方法

如前所述,您不能声明abstract static方法(或字段)。

这不仅仅是语法。根本原因是Java static成员没有被继承。这意味着static成员通常不能多态使用。当您调用static方法或访问static字段时,哪个类成员被调用/使用的决定是在编译时确定的,仅基于编译时类型的考虑

所以...基本上...您想要做的事情无法完成。

但是有解决方案。如果要在方法上使用abstract,请将其声明为实例方法。是否正在执行此操作,以便可以多态使用此方法...或出于其他原因。

您对此表示反对:

类似的方法应该是非静态的,因为您将始终在实例上调用它。 –托马斯2小时前

当然不是-“ TwistyRubik”的所有实例的名称都相同。它显然属于该类,而不是其实例。 – 1小时前Ralf Kleberhoff

但是我认为您错过了重点。方法不“属于”实例。方法属于类。甚至是非静态方法。我们将非静态方法称为“实例”方法,因为它们通常在特定实例的状态下运行。但是他们不需要。实例方法可以返回有关其所属类的信息。

这是我写你的例子的方式:

public abstract class TwistyPuzzle {
    public abstract String getName();
    ...
}
    
public class TwistyCube extends TwistyPuzzle
    public String getName();
        return "Rubik Cube";
    }
    ...
}

所以让我们分析一下:

  • 问:它具有所需的行为吗?
    A:是的。每个TwistyCube实例都将返回"Rubik Cube"

  • 问:将其设为非静态方法会产生空间开销吗?
    A:不会。方法代码是共享的,并且由于Java不会将方法视为实例的可更新属性,因此没有按对象存储的开销。

  • 问:将其设置为非静态方法会带来性能开销吗?
    A:在大多数情况下不可以。如果有开销,那么开销很小。

  • 问:比static方法有优势吗?
    A:是的。 getName()可以与 runtime 方法分派一起使用。

那么这里的 actual 问题是什么? “属于”是什么意思?

坦率地说,我认为这只是概念化实例方法的方式。您在实例上调用方法的事实并不意味着它需要返回特定于该实例的信息。

将Java视为工具。按设计使用方式使用它。如果您希望使用abstract(例如多态)方法来传递有关当前Java类的信息,那么 this standard 的实现方法。


关注

一个单独的枚举-一种TwistyPuzzle的类型提供一个值,该枚举如何提供这种信息呢?

我想那行得通。但是现在您遇到了获取与您要查询的特定enum实例(或类)相关的正确TwistyPuzzle值的问题。并且您遇到了一个可读性/可维护性问题,其中涉及与每个TwistyPuzzle类有关的信息,这些信息都位于单独的类中;即enum

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。