El acoplamiento y la cohesión son dos conceptos que se encuentran en Java (y en todos los demás lenguajes orientados a objetos). El acoplamiento mide cuánto dependen cada uno de los módulos del programa de los otros módulos. La cohesión mide cuán fuertemente están relacionadas cada una de las funciones dentro de un módulo. En realidad, cualquier lenguaje orientado a objetos (incluido Java) tiene los dos objetivos principales de aumentar la cohesión y disminuir el acoplamiento al mismo tiempo, para así desarrollar programas más eficientes. Estas dos métricas de ingeniería de software fueron desarrolladas por Larry Constantine para reducir el costo de modificar y mantener el software.
Aunque el acoplamiento y la cohesión se relacionan con la calidad de un módulo en ingeniería de software, son conceptos completamente diferentes. La cohesión habla de cuánto se relacionan las funciones entre sí dentro del módulo, mientras que el acoplamiento trata de cuánto depende un módulo de los otros módulos del programa dentro de la aplicación completa. Para tener el software de mejor calidad, la cohesión y el acoplamiento deben alcanzar los dos extremos opuestos de sus espectros. En otras palabras, el acoplamiento flexible y la fuerte cohesión proporcionan el mejor software.