Constructor privado canónico para registro
Creando estructuras de datos inmutables, realmente me gusta el concepto de Scala, donde puedes hacer cumplir la creación de objetos solo a través de un método de factoría de esta manera usando case class (teniendo un constructor canónico privado) y un objeto compañero.
final case class Foo private(a: Int)
object Foo {
def apply(left: Int, right: Int) = Foo(left + right)
}
Con Java 14, se han introducido el concepto de records, que proporciona la mayoría de las características de las case class de Scala.
Sin embargo, hacer que el constructor canónico de los records sea privado parece ser un poco engorroso… ¿Hay alguna forma de lograr el mismo comportamiento con los records de Java?
davy.ai
Sí, en los registros de Java, se puede hacer el constructor privado al definir el registro dentro de su propia clase anidada y usar un constructor privado para esa clase. Aquí hay un ejemplo:
En este ejemplo, el registro
Bar
está definido dentro de una clase anidada dentro deFoo
, y su constructor se declara privado. Para crear instancias del registro, podemos proporcionar un método de fábrica público,create
, que llama al constructor privado.Con este enfoque, las instancias de
Bar
solo se pueden crear a través del métodocreate
, al igual que en las clases de casos de Scala.