domingo, 11 de dezembro de 2005

Dica Java - Casting de tipos primitivos

Casting, no que diz respeito às linguagens de programação, tem o sentido moldar um objeto ou tipo primitivo em um outro molde. Normalmente chamamos de conversão. Este artigo focará os tipos primitivos usando no Java. Apresentemos os tipos primitivos do Java:

Descrição
Declaração
Detalhes
Lógico
boolean variavel = true;
Aceita true ou false.
Caracter
char variavel = 'a';
char variavel = 97;
É possível atribuir um único caractere dentro de dois apóstrofos ou simplemente o seu código ASCII
Byte
byte variavel = 100;
Tipo númerico que aceita números entre -128 e 127
Short
short variavel = 2000;
Suporta números entre -32.768 e 32.767
Inteiro
int variavel = 400050;
Aceita números que variam de -2.147.483.648 até 2.147.483.647
Longo
long variavel = 100780000;
Número longo que suporta valores entre
-9.223.372.036.854.775.808 e
9.223.372.036.854.775.807
Ponto Flutuante
float variavel = 5.789f;
Simples precisão (7 casas decimais)
Duplo
double variavel = 0.789;
Dupla presição (15 casas decimais)

O diagrama abaixo representa a "hierarquia" de conversão.




Vemos neste diagrama que somente os tipos byte, short e char podem ser convertidos para o tipo int. Vemos também que todos os tipos podem ser convertidos para o double. O diagrama torna-se agora compreensível para os demais tipos. Tanta definição, tanto "decoreba"... mas como converter? Existe a possibilidade de ocorrerem erros? Vejamos um exemplo:


Início do arquivo casting.java

public class casting {

   public static void main(String[] args) {

      char c;
      byte b;
      short s;
      int i;

      // Conversão de Short para Byte
      s = 200;
      b = (byte)s; // ocorrerá perda de dados
      System.out.println(b);

      // Conversão de Byte para Short
      b = 100;
      s = (short)b;
      System.out.println(s);

      // Conversão de Char para Int
      c = 'a'; // código ASCII = 97
      i = (int)c; // utilizará o código ASCII
      System.out.println(i);

   }

}
Fim do arquivo casting.java

Quando fazemos (short)b , estamos convertendo a variável b em short. Caso não existe a obediência da hierarquia mostrada neste artigo, haverá perda de dados (inconsistência de dados). Um detalhe interessante em casting de tipos primitivos é a conversão utilizando o tipo CHAR, é utilizado o seu código ASCII no processo.

Existe a possibilidade de convertermos objetos. Neste caso, poderíamos tratar não simplesmente de uma conversão e sim de um novo molde ao objeto convertido. É como se pudéssemos moldar um objeto CachorroDeGuarda para um objeto CachorroJaTreinado. Existe a necessidade de haver semelhança entre essas classes (objetos).

Dica Java: Manipulando datas no J2SE e J2ME


1. Formatando um objeto Date (J2SE)

// Este será o objeto que fará a formatação
SimpleDateFormat formatadorData;
// String auxiliar que receberá a data formatada
String minhaDataFormatada = null;
// Data atual. Instanciando uma Data (a data e hora são atualizado
// apenas quando re-instanciamos o objeto, usando o operado "new").
Date minhaData = new Date();

formatadorData = new SimpleDateFormat("dd/MM/yyyy");
minhaDataFormatada = formatadorData.format(minhaData);
System.out.println(minhaDataFormatada);

formatadorData = new SimpleDateFormat("MM/dd/yy");
minhaDataFormatada = formatadorData.format(minhaData);
System.out.println(minhaDataFormatada);

formatadorData = new SimpleDateFormat("dd/MM/yy hh:mm:ss");
minhaDataFormatada = formatadorData.format(minhaData);
System.out.println(minhaDataFormatada);

2. Validando uma String e convertendo para Date (J2SE)

public static boolean dataValida(String data) {

DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
Date minhaDataConvertida = null;

df.setLenient(false);

try {
minhaDataConvertida = df.parse(data);
} catch (ParseException pex) {
return false;
}

return true;
}

3. Personalizando um objeto Date (J2SE/J2ME)

// Instanciando um objeto do tipo Date. Neste caso ele está
// utilizando a data atual, mas poderia ser qualquer objeto do
// tipo Date.
Date minhaData = new Date();

// Inicializando o "Calendar". Iremos utilizá-lo para pegar
// o dado desejado do objeto "Date".
Calendar meuCalendario = Calendar.getInstance();

// "Setando" os milisegundos do objeto "Date" para o "Calendar".
// Poderia ser qualquer objeto do tipo Date. Exemplo: Quando em J2ME,
// trabalhamos com DateField e queremos manipular, utilizamos
// o método getDate() para retornar um objeto do tipo "Date".
meuCalendario.setTime(minhaData);

// Escrevendo as inforações
System.out.println("Dia: " + meuCalendario.get(Calendar.DATE));
System.out.println("Mês: " + (meuCalendario.get(Calendar.DAY_OF_MONTH) + 1));
System.out.println("Ano: " + meuCalendario.get(Calendar.YEAR));
System.out.println("Dia da semana: " + meuCalendario.get(Calendar.DAY_OF_WEEK));
System.out.println("Horas: " + meuCalendario.get(Calendar.HOUR ));
System.out.println("Minutos: " + meuCalendario.get(Calendar.MINUTE ));
System.out.println("Segundos: " + meuCalendario.get(Calendar.SECOND ));
System.out.println("Milisegundos: " + meuCalendario.get(Calendar.MILLISECOND ));


4. Pegando a data atual J2ME

Calendar meuCalendario = Calendar.getInstance();
System.out.println("Dia: " + meuCalendario.get(Calendar.DATE));
System.out.println("Mês: " + (meuCalendario.get(Calendar.DAY_OF_MONTH) + 1) );
System.out.println("Ano: " + meuCalendario.get(Calendar.YEAR));

Dica Java: lendo e escrevendo strings em arquivos, linha a linha


1. Escrevendo

try {

    // Strings a serem inseridas no arquivo.
    String[] meusLinks = new String[] {
        "http://java.sun.com",
        "http://www.linux.org",
        "http://msdn.microsoft.com/netframework"};

    // Instanciando um objeto que irá escrever no arquivo "C:\MeusLinks.txt".
    // O segundo argumento informado no construtor, quando "true", siginifica
    // que os bytes serão escritos no fim do arquivo.
    FileOutputStream meuArquivo = 
new FileOutputStream("C:\\MeusLinks.txt", 
true);



    for (int i=0 ; i<meusLinks.length ; i++) {

        // Convertendo a String para "Array" de "char"
        char[] caracteres = meusLinks[i].toCharArray();
        for (int j=0 ; j<caracteres.length ; j++) {
        meuArquivo.write( (byte)(caracteres[j]) );
        }

        // Escrevendo o byte que pula a linha
        char pulaLinha = 13;
        meuArquivo.write( (byte)(pulaLinha) );
        pulaLinha = 10;
        meuArquivo.write( (byte)(pulaLinha) );
    }

    meuArquivo.close(); // Fechando o arquivo

} catch (FileNotFoundException e) {


} catch (IOException e) {


}


2. Lendo

String linhaAtual = new String();
try {
    // Objeto leitor do arquivo "C:\MeusLinks.txt"
    FileReader fileReader = new FileReader("C:\\MeusLinks.txt");
    // Objeto que manipula o incremento/leitura das linhas do arquivo
    LineNumberReader lineNumber = new LineNumberReader(fileReader);

    // Lendo as linhas do arquivo
    while ((linhaAtual = lineNumber.readLine() ) != null ){
        System.out.println(linhaAtual);
    }
    lineNumber.close();
    fileReader.close();

} catch (FileNotFoundException e) {

} catch (IOException e) {

}

Dois textos pequenos que me fizeram refletir sobre qualidade de vida. Os textos são de Jorge Luis Borges e Bryan Dyson.

O objetivo desse post é compartilhar dois textos bem interessante, que certamente o levará a refletir sobre sua qualidade de vida. Os textos...