Guia de introdução
Aplicação de técnicas básicas e conceitos
Trabalhar com classes locais
Ler dados do banco de dados
Trabalhar com objetos de dados estruturados
Trabalhar com tabelas internas complexas
Implementar atualizações do banco de dados utilizando business objects
Descrição do modelo de programação de aplicativos ABAP RESTful

Criar instâncias de uma classe

Objective

After completing this lesson, you will be able to criar instâncias de uma classe ABAP.

Criação de instância

Você trabalha com atributos como variáveis normais do mesmo tipo. No entanto, fora da classe, o nome do atributo não é suficiente para identificar o atributo univocamente. Para abordar um atributo estático fora da classe, primeiro digite o nome da classe, depois o seletor de componentes estáticos (=>) e só depois o nome do atributo. O seletor de componente estático é uma seta dupla composta por um sinal de igual e o sinal de maior que.

Dica

Não são permitidos espaços em branco antes ou depois do seletor de componentes.

Por exemplo, atributos a situação é ainda mais complicada: para acessar um componente de instância, você precisa de uma variável de referência.

Uma variável de referência é um tipo especial de variável que você usa para criar, endereçar e gerenciar um objeto. Uma variável de referência é usada para apontar para a instância de uma classe na memória do programa. Você declara variáveis de referência usando a instrução DATA com o suplemento TYPE REF TO seguido pelo nome de uma classe.

O valor inicial de uma variável de referência é chamado de referência NULL; a referência ainda não aponta para nenhum lugar.

Para criar uma nova instância de uma classe, você utiliza o operador NEW. O exemplo acima utiliza uma expressão NEW #( ) no lado direito de uma avaliação. O resultado da expressão é o endereço de memória da instância recém-criada. Essa referência é então armazenada na variável de referência no lado esquerdo da atribuição.

Você pode ter percebido que o nome da classe que deseja instanciar não aparece em nenhum lugar na expressão. No entanto, a partir da localização da expressão NEW #( ), o sistema já sabe que a conexão da variável de destino tem o tipo REF TO lcl_connection e, consequentemente, sabe que deve criar uma instância da classe lcl_connection. O sinal de libra após o operador NEW significa "usar o tipo da variável antes do sinal de igualdade". (em cenários mais avançados, você pode realmente especificar o nome da classe no lugar do sinal de libra).

Dica

Deve haver pelo menos um espaço em branco entre os parênteses.

Quando você aborda uma classe pela primeira vez (que pode estar acessando um componente estático ou criando uma instância da classe), o sistema de tempo de execução também carrega a definição de classe para a memória do programa. Esta definição de classe contém todos os atributos estáticos, que só existem uma vez na classe em vez de uma vez para cada instância.

Você aborda componentes estáticos utilizando o nome da classe e o seletor de componentes estáticos. Isso não funciona para componentes de instância porque você tem que indicar a instância que quer acessar.

Para abordar um atributo de instância fora da classe, primeiro digite a variável de referência, depois o seletor de componente de instância (->) e somente depois o nome do atributo. O seletor de componente de instância é uma seta composta por um traço e o sinal de maior que.

Nota

Ao contrário de muitas outras linguagens de programação, o ABAP usa caracteres diferentes, por exemplo, seletor de componentes e seletor de componente estático.

Uma das principais características da programação orientada a objetos é o fato de você poder criar várias instâncias da mesma classe. Cada instância é criada em um local diferente na memória do programa e os valores dos atributos de instância em uma instância são independentes dos valores em outras instâncias. Mas como o gráfico ilustra, as instâncias da mesma classe compartilham o valor para os atributos estáticos.

Se você atribuir uma variável de referência a outra, o sistema copiará para a segunda variável de referência o endereço do objeto para o qual a primeira variável está apontando. O resultado disso é que você tem duas variáveis de referência que apontam para o mesmo objeto.

Você pode usar a mesma variável de referência para criar mais de uma instância de uma classe. Cada vez que você utiliza a expressão NEW #( ), o sistema cria uma nova instância da classe e coloca o endereço da nova instância na variável de referência. No entanto, o endereço da nova instância sobregrava o endereço da instância anterior.

No exemplo acima, o endereço de lcl_connection (2) sobregrava o endereço de lcl_connection (1). Consequentemente, não há mais uma variável de referência no programa apontando para lcl_connection (1). Quando isso ocorre com uma instância, ela não pode mais ser acessada do programa.

Para evitar que a memória do programa fique cheia de objetos que não podem mais ser tratados e possivelmente haja um estouro, o sistema de tempo de execução tem um componente chamado coletor de lixo. O coletor de lixo é um programa que é executado periodicamente para procurar e destruir objetos para os quais não há mais referências apontando. Se, durante um programa, você excluir a última referência a um objeto sobregravando-o ou usando a instrução CLEAR, o coletor de lixo destruirá o objeto em sua próxima execução.

Nota

No final de um programa, quando todas as variáveis de referência forem liberadas, o coletor de lixo destruirá todas as instâncias para as quais apontaram. Você não precisa se preocupar com o gerenciamento de recursos no programa.

Como criar instâncias de uma classe ABAP

Administração de instâncias em uma tabela interna

Uma forma que você pode usar para manter os objetos ativos é colocar as referências em uma tabela interna. Esta é uma técnica que você também pode querer usar se estiver criando uma série inteira de objetos. Ela permite que você use uma única variável de referência para criar muitos objetos. Embora a variável de referência seja sobregravada com o endereço do próximo objeto, os objetos existentes são seguros porque a tabela interna contém uma referência a eles. Assim, você nunca elimina a "última" referência aos objetos.

Como administrar instâncias em uma tabela interna

Criar e gerenciar instâncias

Neste exercício, você criará e gerenciará instâncias de sua classe local.

Modelo:

  • /LRN/CL_S4D400_CLS_LOCAL_CLASS (classe global)

Solução:

  • /LRN/CL_S4D400_CLS_INSTANCES (classe global)

Tarefa 1: Copiar modelo (opcional)

Copie a classe modelo. Se você tiver concluído o exercício anterior, pode ignorar esta tarefa e continuar processando sua classe ZCL_##_LOCAL_CLASS.

Etapas

  1. Abra o texto fonte da classe global /LRN/CL_S4D400_CLS_LOCAL_CLASS no editor ABAP.

    1. Na barra de ferramentas Eclipse, selecione Abrir objeto de desenvolvimento ABAP. Como alternativa, pressione Ctrl + Shift + A.

    2. Insira /LRN/CL_S4D400_CLS como cadeia de pesquisa.

    3. Na lista de objetos de desenvolvimento, selecione /LRN/CL_S4D400_CLS_LOCAL_CLASS e, em seguida, OK.

  2. Vincule a visão Explorador de projetos ao editor.

    1. Na barra de ferramentas do Explorador de projetos, localize o botão Link com editor. Se ainda não estiver pressionado, selecione-o. Como resultado, o objeto de desenvolvimento, que está aberto no editor, deve ser destacado no Explorador de projetos.

  3. Copie a classe /LRN/CL_S4D400_CLS_LOCAL_CLASS para uma classe em seu próprio pacote (nome sugerido: ZCL_##_INSTANCES, onde ## representa seu número de grupo).

    1. Na visão Explorador de projetos, clique com o botão direito do mouse na classe /LRN/CL_S4D400_CLS_LOCAL_CLASS para abrir o menu de conteúdo.

    2. No menu de contexto, selecione Duplicar ....

    3. Insira o nome do seu pacote no campo Pacote. No campo Nome, insira o nome ZCL_##_INSTANCES, onde ## representa seu número de grupo.

    4. Ajuste a descrição e selecione Seguinte.

    5. Confirme a ordem de transporte e selecione Concluir.

Tarefa 2: Criar uma instância

No método principal de sua classe global, declare uma variável de referência e crie uma instância de sua classe local.

Etapas

  1. No método if_oo_adt_classrun~main de sua classe global, declare uma variável de referência (nome sugerido: connection) e digite-a com sua classe local lcl_connection.

    1. Mude para a guia Classe global.

    2. Ajuste o código da seguinte forma:

      Code Snippet
      1234567
      METHOD if_oo_adt_classrun~main. DATA connection TYPE REF TO lcl_connection. ENDMETHOD.
  2. Crie uma instância da classe e defina os atributos carrier_id e connection_id (valores sugeridos: LH para o atributo carrier_id e 0400 para connection_id do atributo).

    1. Ajuste o código da seguinte forma:

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

      Dica

      Depois de digitar o seletor de componentes (->), pressione Strg + Espaço para selecionar os nomes de atributo de uma lista de sugestões.
  3. Ative a classe e utilize o depurador para analisar passo a passo o que acontece.

    1. Pressione Ctrl + F3 para ativar a classe.

    2. Clique duas vezes na margem esquerda do editor ao lado da linha connection = new #( ).para definir um ponto de interrupção.

    3. Pressione F9 para executar a classe.

    4. Clique duas vezes na conexão de palavras para exibir o conteúdo da conexão de variável de referência.

    5. Pressione F5 para ir mais longe no depurador. Verifique se o valor da conexão foi modificado.

    6. Na visão Variáveis, expanda a conexão da ramificação para exibir os atributos iniciais da classe.

    7. Pressione F5 para ir mais longe no depurador. Verifique se o valor de carrier_id foi alterado.

    8. Pressione F5 novamente. Verifique se o valor de Connection_ID foi modificado.

Tarefa 3: Administrar várias instâncias

Crie mais instâncias de sua classe local e armazene as referências a essas instâncias em uma tabela interna.

Etapas

  1. No método if_oo_adt_classrun~main( ) de sua classe global, declare uma tabela interna com o tipo de linha REF TO lcl_connection (nome sugerido: conexões).

    1. Ajuste o código da seguinte forma:

      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. Depois de instanciar a classe e definir os atributos, anexe a referência de objeto à tabela interna.

    1. Ajuste o código da seguinte forma:

      Code Snippet
      123456789
      connection = NEW #( ). connection->carrier_id = 'LH'. connection->connection_id = '0400'. APPEND connection TO connections.
  3. Crie mais duas instâncias da classe lcl_connection, defina seus atributos de instância para valores diferentes dos da primeira instância e anexe as referências às novas instâncias para conexões de tabela interna. Use a mesma conexão de variável de referência para as três instâncias.

    1. Ajuste o código da seguinte forma:

      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. Ative a classe e utilize o depurador para analisar passo a passo o que acontece.

    1. Pressione Ctrl + F3 para ativar a classe.

    2. Clique duas vezes na margem esquerda do editor ao lado da primeira linha connection = new #( ).para remover o ponto de interrupção.

    3. Clique duas vezes na margem esquerda do editor ao lado da primeira linha APPEND connection TO connections.para definir um novo ponto de interrupção.

    4. Pressione F9 para executar a classe.

    5. Clique duas vezes na conexão de palavras para exibir o conteúdo da conexão de variável de referência.

    6. Clique duas vezes nas conexões de palavras para exibir o conteúdo das conexões de tabela interna.

    7. Pressione F5 para ir mais longe no depurador. Verifique se o conteúdo das conexões foi modificado.

    8. Na visão Variáveis, expanda as conexões de ramificação para exibir o conteúdo da tabela interna.

    9. Pressione F5 várias vezes até chegar ao fim do programa. Enquanto isso, verifique o conteúdo da tabela interna.

    10. Compare seu código na guia Classe global com o seguinte extrato da solução modelo:

      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.