如何将抽象类转换为接口?

Arv*_*ind 2 java abstract-class interface

我有一个使用arraylists的java程序 - 这些arraylists存储'变量',其中'变量'是一个抽象类.

现在,为了节省内存,我想使用一个名为HugeCollections-VanillaJava的java库 - 但是这个库需要定义一个接口.

如何将抽象类转换为接口?为了正确执行转换,我必须遵循哪些规则/限制?

最后,我是否可以使用我的抽象类进行最少的代码更改,以便需要接口的库也能正常工作?理想情况下,我不想改变抽象类......这可能吗?

T.J*_*der 6

如何将抽象类转换为接口?

  1. 制作抽象类源文件的副本.

  2. 在初始声明中将"class"更改为"interface".

  3. 更改名称(可选,取决于您正在做什么).

  4. 删除该类实现的任何方法的主体.

  5. 从其他单词中删除"abstract"一词.

  6. 删除所有私人和受保护的成员.

  7. 删除所有构造函数.

  8. 从公共成员中删除关键字"public".

如果您删除了任何代码(已实现的方法,私有或受保护的东西),请让您的原始抽象类实现您的界面并将其保留在那里.

(不完整)示例:

Foo 作为抽象类:

public abstact class Foo
{
    private int bar;

    public static final int SOME_CONSTANT = 42;

    public Foo(b) {
        this.bar = b;
    }

    public abstract void doSomething(String s);

    protected int doSomethingElse() {
        return this.bar * 2;
    }
}
Run Code Online (Sandbox Code Playgroud)

Foo 作为界面:

public interface Foo
{
    int SOME_CONSTANT = 42;

    void doSomething(String s);
}
Run Code Online (Sandbox Code Playgroud)

在我的情况下,因为我确实有一些旧的东西Foo,我可能有AbstractFoo或什么:

public abstact class AbstractFoo implements Foo
{
    private int bar;

    public Foo(b) {
        this.bar = b;
    }

    public abstract void doSomething(String s);

    protected int doSomethingElse() {
        return this.bar * 2;
    }
}
Run Code Online (Sandbox Code Playgroud)

......所以如果需要的话,一个实现可以使用它作为起点(虽然private bar在那里,它没有多大意义).