通常,您应该更喜欢接口而不是具体的类。沿着这些思路,如果可以避免使用new运算符(就像在新的ArrayList示例中那样始终需要使用具体类型),那就更好了。

所有这些都与管理代码中的依赖关系有关。最好仅依赖于高度抽象的事物(例如接口),因为它们也往往非常稳定(请参阅http://objectmentor.com/resources/articles/stability.pdf)。因为它们没有代码,所以仅当API更改时才需要更改它们,换句话说,当您希望该接口向世界展示不同的行为(即设计更改)时。

另一方面,课程总是在变化。依赖于类的代码不在乎它如何执行其工作,只要API的输入和输出不变,调用者就不必在意。

您应该根据开放式原则(参见http://objectmentor.com/resources/articles/ocp.pdf)努力确定类的行为,这样即使添加功能也无需更改现有接口,您可以只指定一个新的子接口。

避免使用新运算符的旧方法是使用Abstract Factory模式,但这有其自身的一系列问题。更好的方法是使用Guice之类的工具进行依赖项注入,而更喜欢构造函数注入。在开始使用依赖项注入之前,请确保您了解依赖关系反转原理(请参阅http://objectmentor.com/resources/articles/dip.pdf)。我见过很多人注入不合适的依赖项,然后抱怨该工具没有帮助他们……这不会使您成为一名优秀的程序员,您仍然必须适当地使用它。

示例:您正在编写一个程序来帮助学生学习物理。在该程序中,学生可以将球置于各种物理场景中,并观察其行为:将枪从悬崖上的大炮中射出,将其置于水下,深空等。问题:您想包含一些关于球的沉重性的信息Ball API中的球...您应该包含getMass()方法还是getWeight()方法?

重量取决于碰巧碰到的球的环境。调用方可以方便地调用一个方法并在碰巧碰到的地方获取球的重量,但是您如何编写此方法呢?每个球实例必须不断跟踪其位置以及当前的重力常数是多少。因此,您应该首选getMass(),因为质量是球的固有属性,并且不依赖于其环境。

等待,如果您只是使用getWeight(Environment)怎么办?这样,ball实例就可以从环境中获取当前g并继续进行……更好的是,您可以使用Guice将环境注入到Ball的构造函数中!我经常看到这种类型的滥用,最终人们指责Guice无法像他们希望的那样无缝地处理依赖项注入。

这里的问题不是Guice,而是Ball API设计。重量不是球的内在属性,因此也不是应该从球上获取的属性。相反,Ball应该使用getMass()方法实现MassiveObject接口,而Environment应该具有一个名为getWeightOf(MassiveObject)的方法。环境固有的是其自身的引力常数,因此它要好得多。而且Environment现在仅依赖于一个简单的接口MassiveObject ...,但是它的工作是包含对象,所以这是应该的。

java 接口类型_Java-从接口类型而不是类声明相关推荐

  1. java jceks 密钥_Java中不同类型的密钥库(Keystore) – 概述

    阅读: 877 密钥库是用于存储加密密钥和证书的存储工具 ,最常用于SSL通信,以证明服务器和客户端的身份.密钥库可以是文件或硬件设备.有三种类型的条目可以存储在密钥库中,取决于密钥库的类型,这三种类 ...

  2. java 接口编程_JAVA面向接口编程

    一.什么是面向接口编程 要正确地使用Java语言进行面向对象的编程,从而提高程序的复用性,增加程序的可维护性.可扩展性,就必须是面向接口的编程.面向接口的编程就意味着:开发系统时,主体构架使用接口,接 ...

  3. java 泛型 擦除_Java泛型和类型擦除

    一 前言:初识泛型 废话不说,先来看一段代码: public class Holder { private Object data; public Holder(Object data ){ this ...

  4. java 泛型示例_Java泛型示例教程–泛型方法,类,接口

    java 泛型示例 Java Genrics is one of the most important features introduced in Java 5. Java Genrics是Java ...

  5. java解包_Java的原始类型自动包装与解包机制

    java5之后对原始数据类型如int.char.long等基本数据类型有自动打包成相应的复合类型Integer.Character.Long等的机制:也可以将复合类型自动转换为原始类型. 这取决于程序 ...

  6. java 不能实例化类型_java不能实例化类型

    8.String类对象的两种实例化方式_计算机软件及应用_IT/计算机_专业资料.Java8面向对象编程视频课程 1. 课程名称:String 对象的两种实例化方式 2.知识点 2.1....... ...

  7. java集合框架中抽象有序列表的接口是_JAVA基础接口集合框架

    接口 -------------------------------------------------------------------------------- 一.接口(是一种规范) 1.接口 ...

  8. java 的分类_java的基本类型(转)

    java的基本类型 java的基本类型可以分为三类,字符类型char,布尔类型boolean以及数值类型byte.short.int.long.float.double.数值类型又可以分为整数类型by ...

  9. java map 教程_Java Map接口

    Java Map接口 在本教程中,我们将学习Java Map接口及其方法. Java collections框架的Map接口提供了Map数据结构的功能. 它实现了Collection接口. map的工 ...

  10. java 基本变量类型_Java自学-基本变量类型

    Java中的基本变量类型 一个变量的类型,决定了该变量可以包含什么样的值. Java中有八种基本类型,都是Java语言预先定义好的,并且是关键字. 这八种基本类型分别是: 整型 (4种) 字符型 (1 ...

最新文章

  1. 【Qt】Qt再学习(一):Application Example
  2. git隐藏修改_您可能不知道的有关Git隐藏的有用技巧
  3. springcloud与dubbo对比:
  4. 如何为WCF应用添加X509证书和安全验证
  5. 多代理集群调度:可伸缩性和灵活性
  6. 新手上路之Hibernate:第一个Hibernate例子
  7. vue设置标签自定义属性_Vue组件化开发之插槽
  8. Day11-递归性能测试
  9. 学习进度条——第九周
  10. 在编写mini2440 helloworld驱动遇到的问题
  11. Bailian2964 日历问题【日期+模拟】
  12. Windows10上安装Keras 和 TensorFlow-GPU
  13. python多因素方差分析_统计科学之多因素方差分析
  14. 一个医院院长的信息化建设感悟:信息化条件下的流程再造
  15. 用万用表判断三极管极性
  16. win7修复计算机是重装吗,win7系统修复无需重装
  17. 垃圾小白羊的leetcode刷题记录6
  18. 13.56Mhz下50欧姆阻抗匹配简易教程
  19. 7-2 符号配对 (20 分) c语言版
  20. tomcat启动找不到jer报错

热门文章

  1. Spark项目 error while loading <root>, error in opening zip file
  2. iphone静音键失灵_静音键——大部分安卓手机都不爱用的神设计
  3. linux下查看vnc端口_linux vnc的默认端口修改
  4. 汽车+辐射测试软件,汽车EMC辐射发射的一些所见所闻和思考
  5. 知识竞赛时,倒计时字体的大小和位置如何调整?
  6. nginx 反向代理机制解决前端跨域问题
  7. 测试过程中常用的linux命令之【删除指定的文件行】
  8. 数据决策力是驱动企业发展的原动力
  9. 数据新闻周报:阿尔法狗将挑战德州扑克
  10. 使用flatten-maven-plugin对发布的POM进行精简