我有一个类方法,它返回一个我可以遍历的员工列表。返回列表的最佳方式是什么?通常我只返回一个 ArrayList。但是,据我了解,界面更适合这种类型的操作。哪个是最好的界面?另外,为什么返回一个接口而不是实现(比如 ArrayList 对象)更好?对我来说,这似乎还有很多工作。
11 回答
@杰森
你也可以返回 IList<> 因为数组实际上实现了这个接口。
像你说的那样,最好的方法是返回一个 List,最好使用泛型,所以它是 List <Employee
>。
返回 List 而不是 ArrayList 意味着如果以后您决定使用 LinkedList,您不必更改任何代码,除了创建对象开始的位置(即调用“new数组列表())”。
如果您所做的只是遍历列表,您可以定义一个将列表返回为 IEnumerable(对于 .NET)的方法。
通过返回仅提供您需要的功能的接口,如果将来出现更好/更快/更好匹配您的应用程序的新集合类型,只要它仍然实现 IEnumerable 您可以完全重写您的方法,使用它里面的新类型,而不更改任何调用它的代码。
是否有任何理由需要订购该系列?为什么不简单地返回一个IEnumerable<Employee>
?这给出了所需的最低限度 - 如果您以后想要某种其他形式的存储,例如袋子或集合或树或诸如此类的东西,您的合同将保持不变。
我不同意返回接口更好的前提。我的原因是您希望最大化给定代码块的有用性。
考虑到这一点,接口可用于接受项目作为参数。如果函数参数调用数组或 ArrayList,那是您唯一可以传递给它的东西。如果函数参数调用 IEnumerable,它将接受其中一个以及许多其他对象。它更有用
然而,返回值则相反。当您返回一个 IEnumerable 时,您唯一能做的就是枚举它。如果您有一个方便的 List 并返回它,那么调用您的函数的代码也可以轻松地执行许多其他操作,例如获取计数。
不过,我支持那些建议您远离 ArrayList 的人。泛型要好得多。
您的方法的返回类型应该是IList<Employee>
.
这意味着您的方法的调用者可以使用任何IList
提供但不能使用特定于ArrayList
. 然后,如果您在某些时候觉得LinkedList
或YourCustomSuperDuperList
提供更好的性能或其他优势,您可以在您的方法中安全地使用它,而不是搞砸它的调用者。
这大致是接口 101。;-)
接口是实现与实现用户之间的契约。
通过使用接口,您允许实现随心所欲地更改,只要它维护用户的合同。
它还允许多个实现使用相同的接口,以便用户可以重用与接口交互的代码。
你没有说你在说什么语言,但是在 .NETish 中,返回一个 IList 比返回一个 List 甚至一个 ArrayList 没有更多的工作,尽管仅仅提到那个过时的类就让我觉得你是不是在谈论.NET。
接口本质上是一个类具有某些方法或属性的契约;编程到接口而不是直接实现允许更动态和可管理的代码,因为只要“合同”仍然存在,您就可以完全交换实现。
在您描述的情况下,传递接口并没有给您带来特别的优势,如果是我,我会传递具有泛型类型的 ArrayList,或者传递 Array 本身:list.toArray()
实际上,如果那是一个框架,您不应该返回一个列表,至少不要不考虑它,推荐使用的类是一个集合。List 类以服务器可扩展性问题为代价进行了一些性能改进。这实际上是 FXCop 规则。
你有这篇文章的理由