16

昨天我参加了一家领先的 IT 服务公司的面试。技术面试很好,没有问题,然后我又进行了一轮关于管理、设计和流程的面试。除了以下问题,我已经回答了所有问题。

面试官提出的问题:

假设你正在开发一个课程,我将通过扩展它在我的课程中使用它,你记住的关键点是什么?例如,类 A,它有一个名为“方法 A”的方法返回一个集合,比如说“列表”。您将采取哪些预防措施?

我的回答:我会考虑以下几点,例如:

  1. 类和方法需要公开
  2. 方法1返回一个列表,那么这需要是泛型的。所以我们可以避免类转换异常
  3. 如果要在多线程环境中访问该类,则需要同步该方法。

但面试官并不相信我的观点。他期待我给出不同的答案,但我无法理解他的思维过程,他的例外是什么。

所以请提供您的建议。

4

4 回答 4

10

我希望你坚持单一责任、打开/关闭和依赖注入的设计原则。保持无状态、简单和可测试。确保它可以扩展而无需更改。

但那时,我不是在采访你。

于 2013-10-06T06:01:20.230 回答
6

还有一些尚未提及的要点是:

  1. 为您的课程提供体面的文档,这样您就不必深入研究您的代码以了解您提供的功能以及问题所在。
  2. 在将其分发给其他人之前尝试扩展您自己的课程。这样,如果您的课程设计不当,您个人会感到痛苦,从而可以改进它。
  3. 如果您要返回一个列表或任何集合,您需要问的一个重要问题是,“调用者能否修改返回的集合”?或者“这个返回的列表是你班级内部状态的直接表示吗?”。在这种情况下,您可能希望返回一个副本以避免调用者弄乱您的内部状态,即保持适当的封装
  4. 计划方法的可见性public在、protected和方法package private之间画一条明确的线。private确保您不会暴露超出您实际想要的任何内容。删除功能很难。如果您精心设计的 API 缺少某些内容,您可以稍后添加。但是你暴露了大量无用的公共方法,你真的不能在不弃用方法的情况下升级你的 API,因为你永远不知道还有谁在使用它。
于 2013-10-06T07:04:07.700 回答
2

如果您要返回一个集合,您首先应该考虑的是我是否应该保护自己免受调用者改变我的内部状态的影响,例如

List list = myObject.getList();
list.retainAll(list2);

现在我有了list1和之间list2 的所有共同元素 问题是 myObject 可能不希望您破坏它返回的列表的内容。

解决此问题的两种常见方法是获取防御性副本或使用Collections.unmodifiableXxxx() 额外的偏执狂来包装集合,您可能会同时使用这两种方法。

我更喜欢解决这个问题的方法是完全避免归还收藏品。您可以返回一个计数和一个方法来获取第 n 个值,或者为 Map 返回键并提供一个 getter,或者您可以允许访问者访问每个元素。这样您就不会暴露您的收藏或需要副本。

于 2013-10-06T07:58:37.477 回答
0

问题很笼统,但我想补充几点:

  1. 除了您要公开的方法之外,其他方法和变量都是私有的。重点是将能见度保持在最低限度。
  2. 尽可能使其不可变,这将减少多线程环境中的开销。
  3. 您可能想要评估是否支持可序列化性。如果没有,则不提供默认构造函数。如果可序列化,则评估序列化代理模式。
于 2013-10-06T06:54:40.147 回答