当前位置: 首页 > 面试题库 >

我应该何时返回接口,何时返回具体类?

燕永昌
2023-03-14
问题内容

当用Java编程时,我几乎总是出于习惯,编写如下代码

public List<String> foo() {
    return new ArrayList<String>();
}

大多数时候甚至都没有考虑它。现在,问题是:我应该 始终 将接口指定为返回类型吗?还是建议使用接口的实际实现,如果是,在什么情况下使用?

显然,使用该接口有很多优点(这就是为什么它存在的原因)。在大多数情况下,库函数使用哪种具体实现并不重要。但也许在某些情况下确实很重要。例如,如果我知道我将主要随机访问列表中的数据,那LinkedList将是一个坏习惯。但是,如果我的库函数仅返回该接口,我根本不知道。为了安全起见,我什至可能需要将列表明确复制到ArrayList

List bar = foo();
List myList = bar instanceof LinkedList ? new ArrayList(bar) : bar;

但这似乎太可怕了,我的同事们可能会在食堂里把我私刑。当然是这样。

你们有什么感想?您的指导方针是什么?何时倾向于抽象解决方案?何时披露实现细节以获取潜在的性能提升?


问题答案:

例如,如果我知道我将主要随机访问列表中的数据,则LinkedList会很糟糕。但是,如果我的库函数仅返回该接口,我根本不知道。为了安全起见,我什至可能需要将列表明确复制到ArrayList上。

正如其他人都提到的那样,您不必关心库如何实现功能,减少耦合和增加库的可维护性。

如果您作为图书馆的客户可以证明该实现在您的用例中表现不佳,那么您可以联系负责人并讨论最佳的遵循方法(针对这种情况的新方法或只是更改实现) 。

也就是说,您的示例需要过早的优化。

如果该方法很关键,则可能会在文档中提及实现细节。



 类似资料:
  • 关于方法何时应该返回CompletableFuture的一般准则是什么?假设有两个类A和B,其中类B有一个执行大量IO的方法performTask(),类A调用performTask()方法在Java可以使用以下方法编写多线程代码: < li >让方法的调用方决定是否使用ThreadPool异步执行方法。在这种情况下,A将异步调用performTask()方法,这样类B就不需要使其方法异步。 <

  • 你好,我有一个问题与elasticsearch php api,Elastica。 如果我运行这个: 我得到0个结果

  • 问题内容: 从测试中,我得出结论,在以下三种情况下,结果将会恢复。 连接关闭后。例如,客户端调用socket.close()或发生任何套接字错误,它将返回空字符串。 有些数据来了,数据的大小超过。 一些数据来了,数据的大小小于并且短时间后没有更多数据来了(我发现0.1s可以工作)。 有关#3的更多详细信息: 当我运行时,回显: 当我运行时,回显: 我的结论正确吗?在哪里可以看到有关#3的官方说明?

  • 我知道当对象是特定类的实例时,instanceof返回TRUE。例如:

  • 我正在尝试返回一个对象,它应该是IClass的一个实现,具有一个通用类型,是IType的一个实现。 我要返回的实际类扩展了Class (abstract ),其泛型类型为ActualType: 抽象类对象实现了IClass接口,可以有任何扩展IType的类型 ActualType只是实现了IType接口 我在编译时得到一个“类型不匹配:无法从ActualClass转换为IClass”错误。我不明白

  • 问题内容: 我发现自己同意返回接口而不是具体的类。 原因很简单,我要松散耦合。 但是还会有其他影响或权衡吗? 问题答案: 对于List或ArrayList之类的类型,不应进行任何编译,并且应将List提升Code返回到接口。 如果这是通过诸如CopyOnWriteArrayList之类的并发包进行的,并且您使用的是addIfAbsent之类的方法(未在List接口中定义),您将发现自己受到限制。