java插入“implements Xyz”的最佳位置是什么?抽象与扩展类
假设我们有这样一个抽象类:
public abstract class Foo {
public Foo (boolean bar) {...}
}
我们还有一个扩展Foo
的类:
public class FooThread extends Foo {}
顾名思义,FooThread
将是一个线程,因此应该实现Runnable
问题是:就可扩展性和可读性而言,implements Runnable
的最佳位置是什么(或任何其他原因)
一些备选方案可能是:
1)在抽象类中插入implements
:
public abstract class Foo implements Runnable {}
- 查看抽象类时易于理解
- 不易扩展
2)在扩展类中插入implements
:
public class FooThread extends Foo implements Runnable {}
- 抽象类中没有关于线程功能的提示
- 更可扩展
3)将implements
插入扩展类,并将run()
作为抽象方法添加到抽象类中:
public class FooThread extends Foo implements Runnable {}
public abstract class Foo {
public Foo (boolean bar) {...}
public abstract void run();
}
- 查看抽象类时的可读性
- 可扩展(嗯,至少灵活一点)
- 抽象类中的抽象方法有点冗余
- “丑陋”
一般来说,是否有放置implements Runnable
或implements Xyz
的最佳实践?最早还是在真正实现接口的类中?还是真的取决于我们想要什么?你喜欢什么
谢谢你的意见
# 1 楼答案
我得说,这取决于谁将成为可运行的:
关于
implements xyz
问题类似:# 2 楼答案
如果抽象类的所有实例都应该用作可运行任务,那么就让抽象类实现可运行接口
否则不要实施它
# 3 楼答案
你把它放在第一位,它就变成了一个需求。如果不需要的话,不要强迫事情变得
Runnable
。如果他们需要成为Runnable
,那么添加接口因此,在这种情况下,我会支持您的选项(2):将
implements Runnable
放在FooThread
类上,而不是放在Foo
抽象类上,除非Foo
的所有子类都需要作为线程运行(但其名称并不表明是这样)类似地,您不需要按照选项(3)添加
public abstract void run()
,除非所有Foo
实现必须具有该方法;如果是这样的话,您可以根据您的选项(1)简单地实现Runnable
我同意托本的观点,即
FooThread
最好命名为FooTask
。不仅因为可运行不是线程(线程是可运行的,反之亦然),还因为“任务”一词更面向业务领域(更高级别的抽象)