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

  • 788