Pessoal estou trabalhando com dispositivos moveis e lá a economia de memoria se faz importante, pois quanto menas memoria usar em mais dispositivos seu programa irá rodar. Com esse pensamento decidi banir o Int que trabalha com 32 bits e passei a querer usar o byte que usa 8 bits. Li varias coisas sobre o assunto, dizendo que byte deve ser usado quando é necessário o poupamento de memoria o que para mim pareceu ideal, pois nos meus programas não uso números que cheguem nem a 128
O problema fica por conta da classe que criei que é o seguinte :
public class Item {
private Texture imgIco; // Imagem icone do objeto
private byte id, qtdId; // Id para remover o item
public Item(Texture imgIco, byte id, byte qtdId) {
super();
this.imgIco = imgIco;
this.id = id;
this.qtdId = qtdId;
}
Quando vou instanciar o objeto usando o construtor
Item item = new Item(imgId, 1, 0); Aqui ele pede um cast ou seja uma conversão para Int ai fica pior, pois além de gastar memória de um interger, ainda gasta processo com a conversão.
Minha pergunta é : Porque isso acontece se meus números não passa 128?
Poderiam me passar outras maneiras de economizar memoria?
@EDIT
Acabei de ler isso aqui:
agora entendi o Java por padrão reconhece todo número inteiro como int quando uso cast na frente (byte) 1; eu tenho uma perca em processo para conversão em byte, mas um ganho em memória ta bom.
Todo valor numérico, sem identificação específica, é um int em java.
0, 1, 2, 3, 4…
Se for double, usa-se 1D, long, 1L e assim por diante.
Com relação ao byte, você precisará encontrar um meio de obter esse valor.
Concordo com o vine, isso é capaz de atrapalhar mais do que ajudar já que você sempre estár limitado a 255. Você tem tanta certeza que vai ter somente 255 elementos?
Existem outras tecnicas para economizar memória bem mais eficientes que essa. Um exemplo, se você cria tem um array de int e esses números são passados para diversos outros objetos, vale muito mais apena criar uma array de Integer ou uma lista e compartilhar esses valores. Claro que quem recebe o valor também tem que ser um objeto e não um tipo primitivo. Com os tipos primitivos você tem um copia do valor original e toda a vez que faz uma atribuição ou seja no exemplo abaixo utilizando tipos primitivos eu crio 3 inteiros, já utilizando objetos eu crio 1, ja que depois só compartilho sua referência.
Com Tipos Primitivos
private funcaoChamadora(){
int valorParaEnvio = 10; //Primeiro inteiro criado
funcaoRecebedora(valor);
}
private funcaoRecebedora(int valor){ //Segundo inteiro está na variável da função
int valorRecebido = valor;
}
Com Tipos Objetos
private funcaoChamadora(){
Integer valorParaEnvio = 10; //Primeiro objeto criado
funcaoRecebedora(valor);
}
private funcaoRecebedora(Integer valor){ //Não cria o objeto passa uma referência
Integer valorRecebido = valor; //Não cria o objeto, recebe uma referencia
}
Isso deve ser usado com parcimônia tambem, já que um objeto Integer ocupa mais memória que um inteiro normal e sua criação é mais lenta.
Eu acredito que você deva economizar memória com boas práticas de programação, como no exemplo que que coloquei acima ou usando StringBuilder ao invés de String para manipular Textos e não nos tipos das variáveis que você vai usar.
D: realmente parece não valer a pena a conversão, mas tem que ver que eu não sabia que por padrão o java considera 1 inteiro como primitiva int, só queria saber poque não podia trabalhar com byte, mas precisava de uma maneira de fazer economia, o jogo já estava meio inflado e o rapaz ai de baixo deu a solução rs ja melhorou bastante com pouca mudança.
Concordo com o vine, isso é capaz de atrapalhar mais do que ajudar já que você sempre estár limitado a 255. Você tem tanta certeza que vai ter somente 255 elementos?
Existem outras tecnicas para economizar memória bem mais eficientes que essa. Um exemplo, se você cria tem um array de int e esses números são passados para diversos outros objetos, vale muito mais apena criar uma array de Integer ou uma lista e compartilhar esses valores. Claro que quem recebe o valor também tem que ser um objeto e não um tipo primitivo. Com os tipos primitivos você tem um copia do valor original e toda a vez que faz uma atribuição ou seja no exemplo abaixo utilizando tipos primitivos eu crio 3 inteiros, já utilizando objetos eu crio 1, ja que depois só compartilho sua referência.
Com Tipos Primitivos
private funcaoChamadora(){
int valorParaEnvio = 10; //Primeiro inteiro criado
funcaoRecebedora(valor);
}
private funcaoRecebedora(int valor){ //Segundo inteiro está na variável da função
int valorRecebido = valor;
}
Com Tipos Objetos
private funcaoChamadora(){
Integer valorParaEnvio = 10; //Primeiro objeto criado
funcaoRecebedora(valor);
}
private funcaoRecebedora(Integer valor){ //Não cria o objeto passa uma referência
Integer valorRecebido = valor; //Não cria o objeto, recebe uma referencia
}
Isso deve ser usado com parcimônia tambem, já que um objeto Integer ocupa mais memória que um inteiro normal e sua criação é mais lenta.
Eu acredito que você deva economizar memória com boas práticas de programação, como no exemplo que que coloquei acima ou usando StringBuilder ao invés de String para manipular Textos e não nos tipos das variáveis que você vai usar.[/quote]