Notei que o Java não possui ponteiros, o que me dificulta a conversão Delphi (object pascal) para Java.
Notei também que se passar um array de bytes ( byte[] ) como parâmetro para um método Java e esse método alterar os bytes desse parâmetro, o array original que foi enviado é alterado.
Posso concluir então que em Java, se passar um array de bytes ( byte[] ) para um método na verdade está se passando o ponteiro desse array e não a cópia dele ?
Se sim, existe outra forma de passar parâmetros ponteiros sem ser objetos para os métodos ?
Basicamente sim. Se você passa qualquer tipo não primitivo (objetos e arrays), está passando por referência, que são basicamente ponteiros para um mesmo objeto na memória.
Você pode usar o método clone() no array, que irá gerar um novo objeto com os mesmos valores do original, mas que pode ser alterado separadamente (não apontam pro mesmo endereço na memória). Não sei como isso se comporta se o array é de objetos, mas funciona para tipos primitivos (bye, int char, float). Veja o exemplo: https://ideone.com/BZwPyv
Obviamente, dependendo do que você quer fazer, outras opções existem. Pode ser o caso de voc~e explicar melhor seu objetivo, em vez de tentar simplesmente fazer uma conversão de código).
Abraço.
Por ex, em Delphi precisei de uma classe de alocação de memória onde vou adicionando dados de vários tipos num único ponteiro.(pmemory) Essa classe não vê o tipo de dado sendo adicionado; a função que adiciona simplesmente recebe um ponteiro (pinput) e o tamanho e com isso ela move o conteúdo de pinput para pmemory+offset. Quando pmemory estoura, ele é realocado para uma quantidade de memória maior liberando o ponteiro anteior…
Então eu mando o endereço de memória do dado (pinput) e seu tamanho
Em Java, pelo que vi, a linguagem é fortemente tipada, meu pmemory é um byte[] que recebe um byte[] para ser adicionado através de arraycopy.
Então a função que adiciona tem que saber o tipo de dado a ser adicionado para convertê-lo em byte[] para depois adicionar.
Talvez o arraycopy receba dois ponteiros para fazer a movimentação; pesquisei sobre o fonte do arraycopy mas sem sucesso.
Saberia me dizer como o arraycopy trabalha ? ou isso muda para cada máquina virtual ?
Minha recomendação é você focar menos em como era no Delphi e mais no problema que você está tentando resolver, e em como usar o Java para isso.
Por exemplo:
Mas para quê você precisa dessa alocação? Está carregando arquivos? É um buffer? Como são usados esses dados carregados? Não tente simplesmente “converter código”, reescrêva a funcionalidade.
De toda forma, do mesmo jeito que você criou uma classe especial em delphi, pode fazer isso em Java. Essa classe pode ter um método para receber bytes da mesma forma e ir adicionando no array. Se não houver mais espaço no array, você aumenta o tamanho dele. Pelo que lembro, algumas estruturas do próprio Java (como o ArrayList) funcionam assim. Inclusive, você pode usá-las em vez de criar sua próprio classe para gerenciar o array.
Sobre o arraycopy, não sei dizer. Mas é algo que imagino que você consiga testar aí, certo?
Abraço.
1 curtida
Um típico exemplo dessa classe é a manutenção de um banco de dados onde tenho um pmemory com todas as tabelas carregadas, para jogar na interface do usuário; outros pmemory(s) que controlam as chaves dessas tabelas para inclusão/exclusão de registros.
Todos esses objetos pmemory possuem tipos de dados diferentes e é a lógica do aplicativo que me diz onde estou e que tipo de dado estou acessando.
Delphi foi utilizado pela flexibilidade que a linguagem dá com ponteiros e também as interfaces de usuário (telas) são escritas bem mais rápido do que em C++
Focando em Java tenho que redesenhar as novas interfaces mas algumas lógicas como essa do banco de dados não pretendo mudar pois seria muito trabalhoso e levaria muito tempo. Então vendo que vc mencionou o byte[] e não disse nada sobre velocidade, já me animei em utilizar o byte[] na mesma lógica de ponteiros como essa do banco de dados.
Bom, é isso, agradeço muito pelas informações prestadas;
Obrigado
Só me metendo na conversa, o irmão do Delphi nos tempos áureos da Borland é o C++ Builder. Acho que ainda existe. Tem as mesmíssimas coisas.
Vc não vai conseguir fazer ipsis litteris no Java o que vc faz em Delphi, sou o segundo a te falar isso. Recomendo que nos ouça
he he, ipsis litteris é claro que não; acho que a única coisa que dá pra se aproveitar do Delphi para o Java é o conhecimento sobre orientação a objetos; mas o que escrevi aí em cima foi sobre lógica independente de linguagem