El constructor de una clase en ABAP

Cuando empiezas a trabajar con clases en ABAP, tarde o temprano aparece este concepto:

👉 El constructor

Y con él, varias dudas muy comunes:

  • ¿Qué es exactamente un constructor?
  • ¿Para qué sirve?
  • ¿Cuál es la diferencia entre constructor de instancia y estático?
  • ¿Puede una clase tener más de uno?

En este artículo vamos a responder a todo eso de forma clara, precisa y con enfoque práctico.

¿Qué es un constructor?

Un constructor es un método especial de una clase que se ejecuta automáticamente en el momento de la creación de un objeto o de la carga de la clase.

Su función principal es inicializar el estado inicial de la clase o del objeto. Se utiliza para preparar los datos, asignar valores iniciales a los atributos y garantizar que el objeto o la clase comiencen en un estado correcto.

Tipos de constructores

En ABAP existen dos tipos de constructores:

  1. Constructor de instancia (CONSTRUCTOR)
  2. Constructor estático (CLASS-CONSTRUCTOR)

Constructor de instancia

El constructor de instancia es un método que se ejecuta automáticamente cada vez que se crea un objeto de la clase.

CONSTRUCTOR

Características principales

  • Se ejecuta una vez por cada objeto creado.
  • Solo puede tener parámetros IMPORTING. No se permiten parámetros EXPORTING, CHANGING ni RETURNING. Su función es recibir datos para inicializar el objeto, no devolver resultados.
  • Puede declarar excepciones. Si algo falla durante la inicialización, puedes lanzar una excepción para evitar que el objeto se cree en un estado inválido.
  • Puede acceder tanto a atributos de instancia como a atributos estáticos.
  • Puede ser declarado como PUBLIC, PROTECTED o PRIVATE (aunque lo habitual es PUBLIC).
    • Si lo declaras PRIVATE, no podrás crear objetos desde fuera de la clase (útil para patrones como Singleton).
    • Si lo declaras PROTECTED, solo podrás crear objetos desde la clase o sus subclases.
    • Lo más común es declararlo en PUBLIC SECTION para que pueda ser usado desde cualquier parte.

Definir un constructor de instancia


CLASS lcl_producto DEFINITION. 
  PUBLIC SECTION. 
  DATA: nombre TYPE string. 
  METHODS: constructor. 
ENDCLASS. 

CLASS lcl_producto IMPLEMENTATION. 
  METHOD constructor. 
   nombre = 'Producto genérico'. 
  ENDMETHOD.  
ENDCLASS. 

Llamar al constructor


DATA producto TYPE REF TO lcl_producto. 
CREATE OBJECT producto.

Esta es otra manera de instanciar la clase de manera más moderna.


START-OF-SELECTION.
  DATA(producto) = NEW lcl_producto( ).

En ese momento se ejecuta el constructor automáticamente.

💡 Buenas prácticas: Usa me-> dentro del constructor para dejar claro que estás accediendo al atributo de la instancia actual. Aunque no es obligatorio, mejora la legibilidad del código.

Constructor estático

El constructor estático es un método que se ejecuta automáticamente una sola vez cuando la clase se carga en memoria por primera vez.

CLASS-CONSTRUCTOR

Características principales

  • Se ejecuta una única vez durante toda la ejecución del programa.
  • No puede tener ningún tipo de parámetro. Ni IMPORTING, ni EXPORTING, ni CHANGING, ni RETURNING.
  • No puede declarar excepciones. Al ejecutarse automáticamente durante la carga de la clase, no hay forma de capturar errores de forma tradicional. Si falla, el programa fallará.
  • Solo puede acceder a atributos estáticos (no puede acceder a atributos de instancia porque aún no existen objetos).
  • Es siempre privado, no se declara en ninguna sección de visibilidad.
  • No pertenece a ningún objeto. Por eso no puede acceder a atributos de instancia ni usar la referencia implícita me.

Definir un constructor estático


CLASS lcl_configuracion DEFINITION. 
  PUBLIC SECTION. 
  CLASS-DATA: contador TYPE i. 
  CLASS-METHODS: class_constructor. 
ENDCLASS.
 
CLASS lcl_configuracion IMPLEMENTATION. 
  METHOD class_constructor. 
    contador = 0. 
  ENDMETHOD. 
ENDCLASS.

La clase se carga en memoria en el primer acceso a ella, que puede ocurrir en cualquiera de estas situaciones:

  • Al llamar a un método estático (clase=>metodo()).
  • Al crear el primer objeto con CREATE OBJECT o NEW.
  • Al acceder a un atributo estático (clase=>atributo).

Diferencias entre constructor de instancia y estático

CaracterísticaConstructor de instanciaConstructor estático
Nombre en ABAPCONSTRUCTORCLASS-CONSTRUCTOR
Cuándo se ejecutaAl crear un objetoAl cargar la clase en memoria
Puede tener parámetrosSí, solo IMPORTINGNo
Nº de ejecucionesUna por objetoUna sola vez
Acceso a atributosInstancia y estáticosSolo estáticos
VisibilidadPuede ser pública, protegida o privadaSiempre privado (no se declara en secciones)
Uso principalInicializar el estado individual de cada objetoInicializar datos compartidos de la clase

✅ Buenas prácticas

  1. Usa parámetros obligatorios para datos esenciales
    Si un atributo es imprescindible para que el objeto sea válido (ej. id, nombre), hazlo obligatorio en el constructor.
  2. Mantén el constructor simple
    El constructor debe limitarse a inicializar atributos. Evita incluir lógica compleja, accesos a base de datos o llamadas a otros métodos pesados.
  3. Usa me-> para claridad
    Dentro del constructor de instancia, usar me->atributo deja claro que estás accediendo al atributo de la instancia actual.
  4. Documenta los parámetros del constructor
    Si el constructor recibe parámetros, añade comentarios que expliquen su propósito.

¿Puede una clase tener dos constructores?

En ABAP una clase puede tener dos constructores si uno es estático y otro es de instancia, pero solo puede haber un constructor de instancia (CONSTRUCTOR) y solo puede haber un constructor estático (CLASS-CONSTRUCTOR). La alternativa son los método de fábrica.

¿Qué pasa si no defino un constructor?

Si no defines ningún constructor, ABAP proporciona implícitamente un constructor de instancia vacío (sin parámetros) que no realiza ninguna acción.

Esto significa que puedes crear objetos sin problemas, pero no tendrás control sobre la inicialización inicial de sus atributos. Los atributos quedarán con sus valores por defecto según su tipo (vacío para strings, 0 para números, etc.).

El constructor es una pieza clave en el diseño de clases en ABAP.

  • Usa CONSTRUCTOR para inicializar cada objeto con sus datos esenciales.
  • Usa CLASS-CONSTRUCTOR para configurar datos compartidos que pertenecen a la clase en su conjunto.

Y aunque ABAP limita tener múltiples constructores, esto te empuja a usar patrones más claros como los métodos de fábrica.

Entender bien esto te ayudará a escribir código más limpio, más predecible y más fácil de mantener.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *