Passando variavel byte por parâmetro

4 respostas
S

Então, estou fazendo 2 construtores. Eu estou tentando passar 2 variaveis byte e uma int como parâmetro para um metodo.
Quanto a int sem problemas, mas a byte eu nao consigo fazer.
Eu lembro que variaveis tipo float nós fazemos " 33.2f ", por exemplo. Gostaria de saber entao como declarar a byte.

public class Data {
	private byte dia;
	private byte mes;
	private int ano;
	
	public Data() {
		this ();
	}
	public Data(byte dia, byte mes, int ano){
		setDia(dia);
		setMes(mes);
		setAno(ano);
		
	}

4 Respostas

S

Ou só usando cast?tipo ((byte)2) por exemplo

Brainiac.jar

Fazendo cast seria uma forma mais simples, como abaixo:

Data d = new Data((byte)9, (byte)11, 1981);

Na verdade mais simples seria usar o int, porque o problema de usar o byte em outros métodos é esse, que para passá-lo como argumento tem que fazer a conversão, mesmo lá do outro lado o parâmetro tendo o tipo certo.
Por isso o mais usado na maioria dos casos é o int.

Eu recomendaria a você usar o int. A diferença de desempenho é minima, a não ser que você esteja fazendo uma aplicação para uma calculadora kkkkk

ViniGodoy

Se seu sistema for ser paranóico com espaço ocupado, declare o ano também como short ao invés de int.
A paranoia hard seria representar o mês e o ano em uma única variável short (4 bits para o mês, 12 bits para o ano).

Caso contrário, declare tudo como int. Ocupa um pouco mais de memória, mas é mais fácil de lidar e tem melhor performance.

ViniGodoy
Esse seria um modo extremamente econômico de se fazer:
public class Data {

    private static final int MES_MASK = 0xF000;
    private static final int ANO_MASK = 0x0FFF;
    private static final int MES_SHIFT = 12;
    private static final int ANO_SHIFT = 0;

    private byte dia;
    private short mesAno;

    public Data() {
        this(15, 9, 1980);
    }

    public Data(int dia, int mes, int ano) {
        // Cuidado. Se se chama métodos da própria classe no construtor se eles
        // forem final ou private!
        setDia(dia);
        setMes(mes);
        setAno(ano);

    }

    public final void setAno(int ano) {
        ano = ano << ANO_SHIFT & ANO_MASK;
        mesAno = (short) (mesAno & ~ANO_MASK | ano);
    }

    public final void setMes(int mes) {
        mes = mes << MES_SHIFT & MES_MASK;
        mesAno = (short) (mesAno & ~MES_MASK | mes);
    }

    public final void setDia(int dia) {
        this.dia = (byte) dia;
    }

    public int getDia() {
        return dia;
    }

    public int getMes() {
        return (mesAno & MES_MASK) >> MES_SHIFT;
    }

    public int getAno() {
        return (mesAno & ANO_MASK) >> ANO_SHIFT;
    }

    @Override
    public String toString() {
        return String.format("%02d/%02d/%02d", getDia(), getMes(), getAno());
    }

    public static void main(String[] args) {
        //Veja, funciona mesmo!
        System.out.println(new Data());
        System.out.println(new Data(21, 12, 2022));
        System.out.println(new Data(31, 01, 4000));
    }
}

Mais econômico que isso, só transformando os campos internos da data em um contador, indicando um número de dias desde um determinado período de tempo.
Como 2 bytes podem armazenar 65.536 dias, você teria então um período de 179 anos de intervalo para guardar.

Criado 9 de março de 2013
Ultima resposta 10 de mar. de 2013
Respostas 4
Participantes 3