让我们假设我们有一个像这样的抽象类:
public abstract class Foo {
public Foo (boolean bar) {...}
}
我们还有一个扩展 Foo
的类:
public class FooThread extends Foo {}
顾名思义,FooThread
将是一个 Thread,因此应该实现 Runnable。
问题是:就可扩展性和可读性(或任何其他原因)而言,implements Runnable
的最佳位置是什么?
一些替代方案可能是:
1) 将implements
插入抽象类:
public abstract class Foo implements Runnable {}
- 看抽象类容易理解
- 可扩展性较差
2) 将implements
插入到扩展类中:
public class FooThread extends Foo implements Runnable {}
- 在抽象类中没有关于 Thread 功能的提示
- 更具可扩展性
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
是否有最佳实践?在最早的时候还是在真正实现接口(interface)的类中?还是真的取决于我们想要什么?你想要什么?
感谢您的参与!
最佳答案
你把它放在第一位,它成为一个要求。不要强制事情成为Runnable
如果他们不需要。如果他们需要是Runnable
然后添加接口(interface)。
因此,在这种情况下,我会支持您的选项 (2):输入 implements Runnable
在 FooThread
上类而不是 Foo
抽象类,除非 Foo
的所有子类需要作为线程运行(但它的名称并不表明是这种情况)。
同样,你不需要添加public abstract void run()
,根据您的选项 (3),除非所有 Foo
实现必须有那个方法;如果是这样的话,你可以简单地实现 Runnable
相反,根据您的选择 (1)。
我同意 Torben 的观点 FooThread
最好命名为 FooTask
.不仅因为 Runnable 不是线程(线程是 Runnable,反之亦然),还因为“任务”一词更面向业务领域(更高层次的抽象)。
关于java - 插入 "implements Xyz"的最佳位置是什么?抽象类与扩展类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19724372/