有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

谢谢你的意见


共 (3) 个答案

  1. # 1 楼答案

    我得说,这取决于谁将成为可运行的:

    • 整个层次结构->;抽象类
    • 只有一些实现->;仅限必需的实现

    关于implements xyz问题类似:

    • 它们是否有一些共同点,您可以将它们放在基础抽象类中->;抽象类+template method
    • 它们都必须实现这一确切的功能,而且每种功能都完全不同->;抽象类
    • 只有其中一些->;只需要
  2. # 2 楼答案

    如果抽象类的所有实例都应该用作可运行任务,那么就让抽象类实现可运行接口

    否则不要实施它

  3. # 3 楼答案

    你把它放在第一位,它就变成了一个需求。如果不需要的话,不要强迫事情变得Runnable。如果他们需要成为Runnable,那么添加接口

    因此,在这种情况下,我会支持您的选项(2):将implements Runnable放在FooThread类上,而不是放在Foo抽象类上,除非Foo的所有子类都需要作为线程运行(但其名称并不表明是这样)

    类似地,您不需要按照选项(3)添加public abstract void run(),除非所有Foo实现必须具有该方法;如果是这样的话,您可以根据您的选项(1)简单地实现Runnable

    我同意托本的观点,即FooThread最好命名为FooTask。不仅因为可运行不是线程(线程是可运行的,反之亦然),还因为“任务”一词更面向业务领域(更高级别的抽象)