Porque da errado? Byte pede para ser convertido pra int

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:

:smiley: 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 :smiley: 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.

Você tem tantos objetos assim, para precisar de uma economia besta de memória como essa?

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]

To vendo isso já rs :
http://www.brunonardini.com.br/artigos/5-boas-praticas-para-deixar-o-codigo-otimizado XD só sabia da variáveis estáticas, agora sei pq meu game está tão pesado. Vlw mesmo.

Só acrescentando, já leu Java Como Programar ?
muito bom a parte sobre tipos e conversões e uso de memória.

[quote=JavaDreams]Só acrescentando, já leu Java Como Programar ?
muito bom a parte sobre tipos e conversões e uso de memória.[/quote]