代码之家  ›  专栏  ›  技术社区  ›  Nick Heiner

代码到接口而不是实现?[副本]

  •  2
  • Nick Heiner  · 技术社区  · 14 年前

    我认为最好是编写接口代码,而不是实现。在Java中:

    List<User> users = new ArrayList<User>();
    

    不需要指定的运行时类型 users 如果代码只关心它的实现 List

    但是,我遇到许多人认为这是完全正确的,即使他们不使用特定于ArrayList的属性:

    ArrayList<User> users = new ArrayList<User>();
    

    我试图解释,这是冗余,使程序更难改变,但他们似乎并不在意。还有其他重要的原因吗?或者我的信念被夸大了?

    3 回复  |  直到 14 年前
        1
  •  2
  •   Justin Niessner    14 年前

    我个人认为这个论点有两个部分。

    1. 如果从类中的方法返回对象,它应该返回最通用的对象。在这种情况下,如果你可以选择 ArrayList<User> List<User> ,返回 列表<用户> 因为这会让你的学生生活更轻松。

    2. 如果你在一个方法中编码,你不介意硬编码一个具体的类型,那就去吧。这不是我要做的,它将使您的代码在将来变得更脆弱,但由于没有对具体类型的外部依赖(因此是第一部分),您不会破坏任何正在使用您的代码的人。

        2
  •  2
  •   stimms    14 年前

    可测试性是一个原因。如果您使用实现来实现,那么很难模拟出所需的对象并在测试中使用它。您通常最终会扩展实现并覆盖它,这很痛苦。

        3
  •  0
  •   hvgotcodes    14 年前

    如果您想使用依赖注入,这一点非常重要。这对于hibernate也很重要——如果您有集合类型,则必须指定一个接口,因为hibernate提供自己的集合实现。