学习过一段时间的java后,我们会经常听到这样一个词:耦合
那么到底什么是耦合呢?
我的大学课本上给出以下总结:
耦合性是编程中的一个判断代码模块构成质量的属性,不影响已有功能,但影响未来拓展,与之对应的是内聚性。
耦合性:也称块间联系。指软件系统结构中各模块间相互联系紧密程度的一种度量。模块之间联系越紧密,其耦合性就越强,模块的独立性则越差。模块间耦合高低取决于模块间接口的复杂性、调用的方式及传递的信息。
内聚性:又称块内联系。指模块的功能强度的度量,即一个模块内部各个元素彼此结合的紧密程度的度量。若一个模块内各元素(语名之间、程序段之间)联系的越紧密,则它的内聚性就越高。
因此,现代程序讲究高内聚低耦合,即将功能内聚在同一模块,模块与模块间尽可能独立,互相依赖低。没有绝对没有耦合的模块组,只有尽量降低互相之间的影响。使模块越独立越好。
看完是不是还是一头雾水?
没关系,下面用一个小例子解释一下什么叫耦合。
建立一个类。
package com.yx.jdbc;
import com.mysql.jdbc.Driver;
import java.sql.*;
public class JdbcDemo1 {
public static void main(String[] args) throws Exception {
//1.注册驱动
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
//2.获取链接
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/ssm_spring","root","root");
//3.获取操作数据库的预处理对象
PreparedStatement preparedStatement = connection.prepareStatement("select * from account");
//4.执行SQL,得到结果集
ResultSet resultSet = preparedStatement.executeQuery();
//5.遍历结果集
while(resultSet.next()){
System.out.println(resultSet.getString("name"));
}
//6.释放资源
resultSet.close();
preparedStatement.close();
connection.close();
}
}
并在xml中加入依赖。
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
</dependencies>
运行可见结果:
没有问题。
好,此时,我们将xml中的依赖删掉再运行一次。
我们会发现结果如下:
报了Error。注意,此处是直接报错,说明该程序在编译时就已经出错。
我们发现,没有了配置文件中的依赖,这个程序在编译时就已经报错,这就是我们说的耦合。
耦合:程序间的依赖关系
包括:
1. 类之间的依赖
2.方法间的依赖
解耦:
降低程序间的依赖关系
在实际开发中应该做到:编译期不依赖,运行时才依赖
好,如果我们在注册驱动时使用反射呢?
下面是运行结果:
我们会发现,Error变成了异常,这说明编译时已经没有错误,这时的错误是在运行时出现的。
因此我们有了解耦的思路:
解耦的思路:
第一步:使用反射来创建对象,而避免使用new关键字
第二步:通过读取配置文件来获取要创建的对象全限定类名