SOLID y Patrones de Diseño: Sesión 1 - Polimorfismo
Marzo 2021
Referencias
Quiz
public class Main {
public static void main(String... args) {
int n = 1;
duplicar(n);
System.out.println(n);
}
public static void duplicar(int n) {
n *= 2;
}
}
¿Qué se imprime?
1
Invocación de Métodos
- Se crea una copia del valor del argumento
- El parámetro se llama n al igual que la variable
pero existen en 2 scopes completamente distintos - En este caso, la modificación es local al método
class MiClase {
int n = 1;
}
public class Main {
public static void main(String... args) {
MiClase obj = new MiClase();
duplicar(obj);
System.out.println(obj.n);
}
public static void duplicar(MiClase otroObj) {
otroObj.n *= 2;
}
}
¿Qué se imprime?
2
Referencias
- Una referencia es una variable que puede ser pensada como una dirección en memoria
- Los objetos siempre se manejan por referencias*.
- Al igual que en el ejemplo anterior, se hace
una copia del argumento, pero en este
caso la copia es de una referencia - Al ejecutarse duplicar, hay dos
referencias a un solo objeto - Modificamos el objeto a través de otra referencia
*En el futuro Java tendrá primitive classes
Date fecha = new Date();
¿Qué pasa detrás de bambalinas?
Reference Types
- Heap: se crea un objeto de tipo Date
- Stack: se crea una variable de tipo Refencia-a-Date cuyo valor es la dirección en Heap del objeto
¿Por qué referencias?
Referencias
Agregan un grado de indirección que permite algunas cosas, p.j. Polimorfismo
No siempre será así,
en el futuro Java
tendrá primitive clases
Polimorfismo
List<String> info = new ArrayList<>();
En una línea de código
Polimorfismo
- En Java, es la característica que
permite que una referencia de un
tipo T pueda referir a un subtipo de T
¿Y eso para qué me sirve?
public static <T> void sort(List<T> list)
¿Qué tipo de List puede ordenar?
*Firma del método simplificada
¡Cualquiera
que implemente la interface List: ArrayList, LinkedList, CopyOnWriteArrayList, etc.!
Codificamos sin preocuparnos
de la implementación concreta
new
Para aprovechar el Polimorfismo solemos evitar el operador new
var path = Path.of(s);
¿Qué clase nos retorna este método?
En mi computador sun.nio.fs.UnixPath
Realmente no nos preocupa, siempre y cuando sea un Path
Static Factory Method
- Un método estático que crea instancias de un tipo
- Una de las ventajas sobre un constructor es poder retornar un subtipo del mencionado en la firma
- En Java, las interfaces pueden tener métodos estáticos
- El polimorfismo y los Static Factory Method
van de la mano
Una cosa más
class Animal { String llanto() { return "…"; }}
class Perro extends Animal { String llanto () { return "woof"; }}
public class DynamicDispatcher {
public static void main(String[] args) {
Animal animal = new Perro();
System.out.println(animal.llanto());
}
}
¿Qué se imprime?
woof
Polimorfismo
- Los métodos que podemos llamar
están limitados por la referencia - Dynamic Dispatch: Los métodos se resuelven en tiempo de ejecución dependiendo del objeto
Polimorfismo
By Carlos Obregón
Polimorfismo
- 862