Porque da errado? Byte pede para ser convertido pra int
7 respostas
K
klanpaia
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 :
publicclassItem{
privateTextureimgIco; // Imagem icone do objetoprivatebyteid,qtdId; // Id para remover o item publicItem(TextureimgIco,byteid,byteqtdId){
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.
drsmachado
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.
ViniGodoy
Você tem tantos objetos assim, para precisar de uma economia besta de memória como essa?
x111
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.
privatefuncaoChamadora(){IntegervalorParaEnvio=10;//Primeiro objeto criadofuncaoRecebedora(valor);}privatefuncaoRecebedora(Integervalor){//Não cria o objeto passa uma referênciaIntegervalorRecebido=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.
K
klanpaia
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.
privatefuncaoChamadora(){IntegervalorParaEnvio=10;//Primeiro objeto criadofuncaoRecebedora(valor);}privatefuncaoRecebedora(Integervalor){//Não cria o objeto passa uma referênciaIntegervalorRecebido=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.