Introduction
Application des techniques et concepts de base
Utilisation des classes locales
Lecture des données de la base de données
Utilisation d'objets de données structurés
Utilisation de tables internes complexes
Implémentation de mises à jour de base de données à l'aide d'objets de gestion
Description du modèle de programmation d'applications ABAP RESTful

Création d'instances d'une classe

Objective

After completing this lesson, you will be able to créer des instances d'une classe ABAP.

Création d'instance

Vous utilisez des attributs comme des variables normales du même type. En dehors de la classe, le nom d'attribut n'est cependant pas suffisant pour identifier l'attribut sans ambiguïté. Pour adresser un attribut statique en dehors de la classe, saisissez d'abord le nom de classe, puis le sélecteur de composant statique (=>), puis le nom d'attribut. Le sélecteur de composant statique est une double flèche composée d'un signe égal à et du signe supérieur à.

Astuce

Aucun espace n'est autorisé avant ou après le sélecteur de composants.

Pour les attributs d'instance, la situation est encore plus compliquée : pour accéder à un composant d'instance, vous avez besoin d'une variable de référence.

Une variable de référence est un type spécial de variable que vous utilisez pour créer, adresser et gérer un objet. Une variable de référence est utilisée pour pointer vers l'instance d'une classe dans la mémoire de programme. Vous déclarez les variables de référence à l'aide de l'instruction DATA avec l'option TYPE REF TO suivie du nom d'une classe.

La valeur initiale d'une variable de référence est appelée la référence NULL ; la référence ne pointe pas encore n'importe où.

Pour créer une nouvelle instance d'une classe, vous utilisez l'opérateur NOUVEAU. L'exemple ci-dessus utilise une expression NEW #( ) à droite d'une valorisation. Le résultat de l'expression est l'adresse mémoire de la nouvelle instance créée. Cette référence est ensuite enregistrée dans la variable de référence à gauche de l'affectation.

Vous avez peut-être remarqué que le nom de la classe que vous souhaitez instancier n'apparaît nulle part dans l'expression. Cependant, à partir de l'emplacement de l'expression NEW #( ), le système sait déjà que la connexion de la variable cible a le type REF TO lcl_connection, et par conséquent il sait qu'il doit créer une instance de la classe lcl_connection. Le signe dièse après l'opérateur NOUVEAU signifie "utilisez le type de la variable avant le signe égal". (Dans les scénarios plus avancés, vous pouvez en fait indiquer le nom de la classe à la place du signe dièse).

Astuce

Il doit y avoir au moins un espace entre les crochets.

Lorsque vous adressez une classe pour la première fois (qui peut être l'accès à un composant statique ou la création d'une instance de la classe), le système d'exécution charge également la définition de classe dans la mémoire du programme. Cette définition de classe contient tous les attributs statiques qui n'existent qu'une seule fois dans la classe au lieu d'une seule pour chaque instance.

Vous adressez des composants statiques à l'aide du nom de classe et du sélecteur de composants statiques. Cela ne fonctionne pas pour les composants d'instance car vous devez indiquer l'instance à laquelle vous voulez accéder.

Pour adresser un attribut d'instance en dehors de la classe, saisissez d'abord la variable de référence, puis le sélecteur de composant d'instance (->), puis le nom d'attribut. Le sélecteur de composant d'instance est une flèche composée d'un tiret et du signe supérieur à.

Remarque

Contrairement à beaucoup d'autres langages de programmation, ABAP utilise des caractères différents pour le sélecteur de composant d'instance et le sélecteur de composant statique.

L'une des principales caractéristiques de la programmation orientée objet est le fait que vous pouvez créer plusieurs instances de la même classe. Chaque instance est créée à un emplacement différent dans la mémoire du programme et les valeurs des attributs d'instance d'une instance sont indépendantes des valeurs des autres instances. Mais comme l'illustre le graphique, les instances de la même classe partagent la valeur des attributs statiques.

Si vous affectez une variable de référence à une autre, le système copie l'adresse de l'objet vers lequel la première variable pointe dans la deuxième variable de référence. Il en résulte que vous avez deux variables de référence qui pointent vers le même objet.

Vous pouvez utiliser la même variable de référence pour créer plusieurs instances d'une classe. Chaque fois que vous utilisez l'expression NEW #( ), le système crée une nouvelle instance de la classe et place l'adresse de la nouvelle instance dans la variable de référence. Cependant, l'adresse de la nouvelle instance écrase l'adresse de l'instance précédente.

Dans l'exemple ci-dessus, l'adresse de lcl_connection (2) écrase l'adresse de lcl_connection (1). Par conséquent, il n'y a plus de variable de référence dans le programme pointant vers lcl_connection (1). Lorsque cela arrive à une instance, elle ne peut plus être traitée à partir du programme.

Pour éviter que la mémoire du programme ne soit remplie d'objets qui ne peuvent plus être adressés et qui finissent par déborder, le système d'exécution dispose d'un composant appelé Garbage Collecteur. Le Garbage Collector est un programme qui s'exécute périodiquement pour rechercher et détruire des objets vers lesquels plus aucune référence ne pointe. Si, au cours d'un programme, vous supprimez la dernière référence à un objet en l'écrasant ou en utilisant l'instruction CLEAR, le Garbage Collecteur détruira l'objet lors de son prochain passage.

Remarque

À la fin d'un programme, lorsque toutes les variables de référence sont libérées, le Garbage Collector détruira toutes les instances vers lesquelles il avait pointé. Vous n'avez pas à vous soucier vous-même de la gestion des ressources dans le programme.

Comment créer des instances d'une classe ABAP

Gestion des instances dans une table interne

L'une des façons dont vous pouvez maintenir les objets actifs consiste à placer les références dans une table interne. Il s'agit d'une technique que vous pouvez bien vouloir utiliser si vous créez toute une série d'objets. Il vous permet d'utiliser une seule variable de référence pour créer de nombreux objets. Bien que la variable de référence soit écrasée par l'adresse de l'objet suivant, les objets existants sont sûrs car la table interne contient une référence à ceux-ci. Par conséquent, vous ne supprimez jamais la "dernière" référence aux objets.

Comment gérer des instances dans une table interne

Créer et gérer des instances

Dans cet exercice, vous allez créer et gérer des instances de votre classe locale.

Modèle :

  • /LRN/CL_S4D400_CLS_LOCAL_CLASS (classe globale)

Solution :

  • /LRN/CL_S4D400_CLS_INSTANCES (classe globale)

Tâche 1: Copier modèle (facultatif)

Copiez la classe de modèle. Si vous avez terminé l'exercice précédent, vous pouvez ignorer cette tâche et continuer à modifier votre classe ZCL_##_LOCAL_CLASS.

Étapes

  1. Ouvrez le code source de la classe globale /LRN/CL_S4D400_CLS_LOCAL_CLASS dans l'éditeur ABAP.

    1. Dans la barre d'outils Eclipse, sélectionnez Ouvrir ABAP Development Object. Vous pouvez également appuyer sur Ctrl + Maj + A.

    2. Saisissez /LRN/CL_S4D400_CLS comme chaîne de recherche.

    3. Dans la liste des objets de développement, sélectionnez /LRN/CL_S4D400_CLS_LOCAL_CLASS, puis cliquez sur OK.

  2. Liez la vue Explorateur de projets à l'aide de l'éditeur.

    1. Dans la barre d'outils Explorateur de projets, recherchez le bouton Lier à l'éditeur. S'il n'est pas encore appuyé, sélectionnez-le. Par conséquent, l'objet de développement, qui est ouvert dans l'éditeur, doit être mis en surbrillance dans l'explorateur de projets.

  3. Copiez la classe /LRN/CL_S4D400_CLS_LOCAL_CLASS dans une classe de votre propre package (nom proposé : ZCL_##_INSTANCES, ## correspondant à votre numéro de groupe).

    1. Dans la vue Explorateur de projets, cliquez avec le bouton droit de la souris sur la classe /LRN/CL_S4D400_CLS_LOCAL_CLASS pour ouvrir le menu de contenu.

    2. Dans le menu contextuel, sélectionnez Dupliquer ....

    3. Saisissez le nom de votre package dans la zone Package. Dans la zone Nom, saisissez le nom ZCL_##_INSTANCES, où ## représente votre numéro de groupe.

    4. Ajustez la description et cliquez sur Suivant.

    5. Confirmez l'ordre de transport et cliquez sur Terminer.

Tâche 2: Créer une instance

Dans la méthode principale de votre classe globale, déclarez une variable de référence et créez une instance de votre classe locale.

Étapes

  1. Dans la méthode if_oo_adt_classrun~main de votre classe globale, déclarez une variable de référence (nom suggéré : connexion) et saisissez-la avec votre classe locale lcl_connection.

    1. Passez à l'onglet Classe globale.

    2. Adaptez le code comme suit :

      Code Snippet
      1234567
      METHOD if_oo_adt_classrun~main. DATA connection TYPE REF TO lcl_connection. ENDMETHOD.
  2. Créez une instance de la classe et définissez les attributs carrier_id et connection_id (valeurs proposées : LH pour l'attribut carrier_id et 0400 pour l'attribut connection_id).

    1. Adaptez le code comme suit :

      Code Snippet
      12345678
      DATA connection TYPE REF TO lcl_connection. connection = new #( ). connection->carrier_id = 'LH'. connection->connection_id = '0400'.

      Astuce

      Après avoir saisi le sélecteur de composant (->), appuyez sur Ctrl + Espace pour sélectionner les noms d'attributs dans une liste de propositions.
  3. Activez la classe et utilisez le débogueur pour analyser étape par étape ce qui se passe.

    1. Appuyez sur Ctrl + F3 pour activer la classe.

    2. Double-cliquez sur la marge de gauche de l'éditeur en regard de la ligne connection = new #( ).pour définir un point d'arrêt.

    3. Appuyez sur F9 pour exécuter la classe.

    4. Double-cliquez sur le mot connexion pour afficher le contenu de la connexion de variable de référence.

    5. Appuyez sur F5 pour aller plus loin dans le débogueur. Vérifiez que la valeur de la connexion a été modifiée.

    6. Dans la vue Variables, développez la connexion de branche pour afficher les attributs initiaux de la classe.

    7. Appuyez sur F5 pour aller plus loin dans le débogueur. Vérifiez que la valeur de carrier_id a été modifiée.

    8. Appuyez à nouveau sur F5. Vérifiez que la valeur de Connection_ID a changé.

Tâche 3: Gérer plusieurs instances

Créez d'autres instances de votre classe locale et stockez les références à ces instances dans une table interne.

Étapes

  1. Dans la méthode if_oo_adt_classrun~main( ) de votre classe globale, déclarez une table interne avec le type de ligne REF TO lcl_connection (nom suggéré : connexions).

    1. Adaptez le code comme suit :

      Code Snippet
      123456789
      DATA connection TYPE REF TO lcl_connection. DATA connections TYPE TABLE OF REF TO lcl_connection. connection = new #( ). connection->carrier_id = 'LH'. connection->connection_id = '0400'.
  2. Après avoir instancié la classe et défini les attributs, ajoutez la référence d'objet à la table interne.

    1. Adaptez le code comme suit :

      Code Snippet
      123456789
      connection = NEW #( ). connection->carrier_id = 'LH'. connection->connection_id = '0400'. APPEND connection TO connections.
  3. Créez deux instances supplémentaires de la classe lcl_connection, définissez leurs attributs d'instance sur des valeurs différentes de celles de la première instance et ajoutez les références aux nouvelles instances aux connexions de tables internes. Utilisez la même connexion de variable de référence pour les trois instances.

    1. Adaptez le code comme suit :

      Code Snippet
      12345678910111213141516171819202122
      connection = NEW #( ). connection->carrier_id = 'LH'. connection->connection_id = '0400'. APPEND connection TO connections. connection = NEW #( ). connection->carrier_id = 'AA'. connection->connection_id = '0017'. APPEND connection TO connections. connection = NEW #( ). connection->carrier_id = 'SQ'. connection->connection_id = '0001'. APPEND connection TO connections.
  4. Activez la classe et utilisez le débogueur pour analyser étape par étape ce qui se passe.

    1. Appuyez sur Ctrl + F3 pour activer la classe.

    2. Double-cliquez sur la marge de gauche de l'éditeur en regard de la première ligne connection = new #( ).pour supprimer le point d'arrêt.

    3. Double-cliquez sur la marge de gauche de l'éditeur en regard de la première ligne APPEND connection TO connections.pour définir un nouveau point d'arrêt.

    4. Appuyez sur F9 pour exécuter la classe.

    5. Double-cliquez sur le mot connexion pour afficher le contenu de la connexion de variable de référence.

    6. Double-cliquez sur le mot connexions pour afficher le contenu des connexions de tables internes.

    7. Appuyez sur F5 pour aller plus loin dans le débogueur. Vérifiez que le contenu des connexions a été modifié.

    8. Dans la vue Variables, développez les connexions de branche pour afficher le contenu de la table interne.

    9. Appuyez plusieurs fois sur F5 jusqu'à la fin du programme. Lors de cette opération, vérifiez le contenu de la table interne.

    10. Comparez votre code dans l'onglet Classe globale à l'extrait suivant de la solution modèle :

      Code Snippet
      123456789101112131415161718192021222324252627282930313233343536
      METHOD if_oo_adt_classrun~main. DATA connection TYPE REF TO lcl_connection. DATA connections TYPE TABLE OF REF TO lcl_connection. * First Instance ********************************************************************** connection = NEW #( ). connection->carrier_id = 'LH'. connection->connection_id = '0400'. APPEND connection TO connections. * Second Instance ********************************************************************** connection = NEW #( ). connection->carrier_id = 'AA'. connection->connection_id = '0017'. APPEND connection TO connections. * Third Instance ********************************************************************** connection = NEW #( ). connection->carrier_id = 'SQ'. connection->connection_id = '0001'. APPEND connection TO connections. ENDMETHOD.