我有一个使用arraylists的java程序 - 这些arraylists存储'变量',其中'variables'是一个抽象类。
现在,为了节省内存,我想使用一个名为HugeCollections-VanillaJava的java库 - 但是这个库需要定义一个接口。
如何将抽象类转换为接口?为了正确执行转换,我必须遵循哪些规则/限制?
最后,我是否可以使用最少代码更改的抽象类,以便需要接口的库也能正常工作?理想情况下,我根本不想改变抽象类......这可能吗?
答案 0 :(得分:6)
如何将抽象类转换为接口?
制作抽象类源文件的副本。
在初始声明中将“class”更改为“interface”。
更改名称(可选,取决于您正在做什么)。
删除该类实现的任何方法的主体。
从其他单词中删除“abstract”一词。
删除所有私人和受保护的成员。
删除所有构造函数。
从公共成员中删除关键字“public”。
如果您删除了任何代码(已实现的方法,私有或受保护的东西),请让原始的抽象类实现您的界面并将其留在那里。
(Incomplete)示例:
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;
}
}
Foo
作为界面:
public interface Foo
{
int SOME_CONSTANT = 42;
void doSomething(String s);
}
在我的情况下,因为我确实有一些旧的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;
}
}
...因此,如果需要,实现可以将其用作起点(虽然在那里使用private
bar
,但它没有多大意义。)
答案 1 :(得分:3)
模式Adapter可能会对您有所帮助。
想象一下,你必须使用 SomeClass 作为 TargetInterface
public abstract class SomeClass {
// some code here
public abstract void someMethod();
}
public interface TargetInterface {
public void someMethodBlaBla();
}
他们有不同的方法签名 - someMethod()和 someMethodBlaBla()。
所以你可能会创建这样的适配器类:
public class Adapter implements TargetInterface {
private SomeClass adaptee;
public Adapter( SomeClass adaptee ) {
this.adaptee = adaptee;
}
public void someMethodBlaBla() {
this.adaptee.someMethod();
}
//delegate all calls to adaptee
}
和代码中的某个地方你可以同时使用 - 适配器和抽象类的实例,而不会干扰当前代码:
SomeClass abstractClassInstance = ... //get instance of your abstract class
TargetInterface targetInterfaceInstance = new Adapter( abstractClassInstance );
答案 2 :(得分:0)
如果抽象类没有定义任何具体方法,你甚至可以使用正则表达式。从:
public abstract class Abstract {
public abstract void method();
//...
}
为:
public interface Interface {
void method();
//...
}
public abstract
修饰符是接口隐式的。如果abstract
类确实定义了一些方法(并非所有方法都是abstract
)或者有一些字段,则无法完成(至少很容易)。