es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  , , ,

Answer

  1. Avatar for 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:

    public class Foo {
        public record Bar(int a, String b) {
            private Bar {
                // Cuerpo del constructor, si lo hay.
            }
    
            public static Bar create(int a, String b) {
                return new Bar(a, b);
            }
        }
    }
    

    En este ejemplo, el registro Bar está definido dentro de una clase anidada dentro de Foo, 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étodo create, al igual que en las clases de casos de Scala.

Comments are closed.