java - 插入 "implements Xyz"的最佳位置是什么?抽象类与扩展类

标签 java multithreading abstract-class

让我们假设我们有一个像这样的抽象类:

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 Runnableimplements Xyz 是否有最佳实践?在最早的时候还是在真正实现接口(interface)的类中?还是真的取决于我们想要什么?你想要什么?

感谢您的参与!

最佳答案

你把它放在第一位,它成为一个要求。不要强制事情成为Runnable如果他们不需要。如果他们需要Runnable然后添加接口(interface)。

因此,在这种情况下,我会支持您的选项 (2):输入 implements RunnableFooThread 上类而不是 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/

相关文章:

java - 根据token延迟提交任务

java - 如何解决..抽象类?泛型?

java - 我的程序遇到了一些难题(注意不能使用 ArrayList)

java - 绑定(bind) Set 集合中的对象

java - 混合波形文件

c# - CPU 绑定(bind)任务的并行化继续与 IO 绑定(bind)

java - Android:通过索引获取arrayList元素

java - 使用单独的线程更新 JTable

动态的 Java 继承

Java:如何在抽象类中引用子类的静态变量?