Java中抽象属性的解决方法

dea*_*mon 6 java oop attributes abstract-class scala

在Scala中,我会编写一个带有抽象属性的抽象类path:

abstract class Base {

    val path: String

}

class Sub extends Base {

    override val path = "/demo/"

}
Run Code Online (Sandbox Code Playgroud)

Java不知道抽象属性,我想知道解决这个限制的最佳方法是什么.

我的想法:

a)构造函数参数

abstract class Base {

  protected String path;

  protected Base(String path) {
    this.path = path;
  }

}

class Sub extends Base {

    public Sub() {
        super("/demo/");
    }

}
Run Code Online (Sandbox Code Playgroud)

b)抽象方法

abstract class Base { // could be an interface too

  abstract String getPath();

}

class Sub extends Base {

    public String getPath() {
        return "/demo/";
    }

}
Run Code Online (Sandbox Code Playgroud)

你更喜欢哪一个?其他想法?

我倾向于使用构造函数,因为不应该在运行时计算路径值.

zig*_*tar 5

Scala在内部做的是你所描述的方法B.

采用以下示例类:

abstract class Test{
    val path: String
}
Run Code Online (Sandbox Code Playgroud)

当您使用scalac编译它时,它将生成一个抽象Java类,其中包含一个名为attr的抽象方法,它返回一个String.这可能发生的原因是,因为val是常数,因此它只能通过getter而不是setter来模拟.因此,如果要从Java访问此类,则可以简单地覆盖抽象getter方法.

这相当于将生成的Java类(javap的输出):

public abstract class Test extends java.lang.Object implements scala.ScalaObject{
    public abstract java.lang.String path();
    public Test();
}
Run Code Online (Sandbox Code Playgroud)