segunda-feira, 11 de março de 2013

Modificadores Java


Modicadores de Acesso

  1- public = Todas as outras classes podem acessar.
  2- default (implícito em situações onde nenhum outro é inserido, não pode ser escrito no código) = Apenas outras classes do mesmo pacote podem acessar.
  3- protected = Todas as classes do mesmo pacote ou de sub-classes podem ver.
  4- private = Somente a própria classe pode ver.

- Interfaces:

  Para interfaces: public ou sem nenhum (implicitamente public).
  Para atributos e métodos de interfaces: public ou sem nenhum (implicitamente public).

- Classes:

  Para classes: public ou sem nenhum (implicitamente default).

  Para atributos e métodos de classes: public, protected, private ou sem nenhum (implicitamente default).

- Métodos e argumentros:

  Variáveis locais e argumentos de métodos não podem usar modificadores de acesso.

===========================================
package primeiro;
public class ClassePublica{

public int intPublic = 0;
int intDefault = 1;
protected int intProtected = 2;
private int intPrivate = 3;

}
===========================================
package primeiro;
import primeiro.ClassePublica;
public class ClasseTesteModificadorAcesso extends ClassePublica {

int testePublic = intPublic;
int testeProtected = intProtected; // pela herança a classe atual tem acesso aos membros protected da super classe, mesmo estando em pacote diferente.
int testeDefault = intDefault; // pode ser visto por classes de dentro do mesmo pacote
// int testePrivate = intPrivate; // menbros private só podem ser vistos na própria classe

public static void main (String [] args){
ClassePublica classePublica = new ClassePublica();
classePublica.intPublic = 11;
classePublica.intDefault = 22; //é visível aqui, está dentro do próprio pacote
classePublica.intProtected = 33; //é visível aqui, está dentro do próprio pacote. OBS: em instâncias, protected é igual a default.
// classePublica.intPrivate = 44; //não é visível aqui, somente dentro da própria classe
}

}
==========================================
package segundo;
import primeiro.ClassePublica;
public class ClasseTesteModificadorAcesso extends ClassePublica {

int testePublic = intPublic;
int testeProtected = intProtected; // pela herança a classe atual tem acesso aos membros protected da super classe, mesmo estando em pacote diferente.
// int testeDefault = intDefault; // membros default só podem vistos dentro do mesmo pacote
// int testePrivate = intPrivate; // menbros private só podem ser vistos na própria classe

public static void main (String [] args){
ClassePublica classePublica = new ClassePublica();
classePublica.intPublic = 11;
// classePublica.intDefault = 22; //não é visível aqui, somente dentro do próprio pacote
// classePublica.intProtected = 33; //não é visível aqui, somente dentro do próprio pacote, em instâncias protected é igual a default, ou seja, não pode ser visto em pacote diferentes.
// classePublica.intPrivate = 44; //não é visível aqui, somente dentro da própria classe
}

}

=======================================

Outros Modificadores (Exceto Modicadores de Acesso)

- Final

  Esse modificador significa que ao ser marcado:
  Classes: Não podem ser extendidas. OBS.: Interfaces e classes abstract não podem receber esse modificador.
  Métodos: Não podem ser sobrescritos.
  Variáveis de instância, variáveis locais e argumentos de método: Não podem ter suas referências alteradas, ou seja, não podem apontar para um novo objeto. Somente alterar o próprio objeto referenciado. No caso de primitivos(int, double, etc...) nenhuma alteração é possível, nem de valor.

- Abstract

  Toda interface é implicitamente abstract.
  Classes podem ser abstract. Isso implica que não pode ser instânciada. Deve ser extendida para ser usada.
  Métodos podem ser abstract. Se uma classe possui pelo menos um método abstract, a classe também deve ser marcada com abstract. E qualquer subclasse concreta dela deve implementar todos os métodos abstract, ou seja, sem implimentação.
  O modificador abstract não pode ser usado juntamente com os modificadores final e private.

- Synchronized

  Esse modificador só pode ser usado em métodos.
  Significa que o método marcado só pode ser acessado por uma Thread de cada vez.

- Native

  Só pode ser aplicado a métodos.
  Um método native não deve ter corpo, ou seja, terminar com (;) ponto e vírgula.

- Strictfp

  Somente classe e métodos podem usar esse modificador.
  Significa que seus ponto flutuates não são dependentes de plataforma. Eles obdeceram ao padrão IEEE 754.

- Transient

  Significa que a variável não será serializada no caso no objeto que a contenha seja serializado. Ou seja, ao deserializar o objeto esse valor será perdido.
  Só pode ser usado em variáveis de instância.

- Volatile

  Só pode ser usado em variáveis de instância.




quinta-feira, 20 de setembro de 2012

JQuery: Restringir caracteres, tamanho e formatar campo de data, cpf e telefone


Nesse post vou mostrar algumas funções prontas com javascript que muito atrapalham e fazem todo desenvolvedor Java perderem muito tempo no dia-à-dia, por não se tratar especificamente da nossa área. Para ajudar vou postar as funções que podem ser copiadas e usadas sem perda de tempo.

Sempre estamos fazendo formulários e nesses formulários precisamos inserir campos como data, data e hora, telefone, cpf, entre outros.

O problema é que não podemos colocar somente o campo lá e aceitar que o usuário digite de qualquer jeito. Para isso podemos usar o Javascript ou JQuery para guiar os usuário a preencherem como desejamos ou como o dono do software deseja que seja inserido os dados.

A forma de fazer isso mais fácil é com JQuery sem dúvidas, veremos nesse tutorial. Mas como nem sempre estamos em um projeto que tem JQuery e também não podemos inserir podemos usar também o Javascript para fazer a mesma coisa de um jeito um pouco mais difícil, clique aqui.


Abaixo segue forma de validar cada tecla precionada no teclado e apenas permitir as que convém para o campo em questão DATA (somente números) os demais digitos o JQuery coloca (Máscara). Para baixar o arquivos fonte, clique aqui. Para baixar os arquivos do JQuery usados no exemplo, utilize os links abaixo.

<html>
<head>
//importa os arquivos do JQuery e do plugin de sites externos

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
<script src="http://cloud.github.com/downloads/digitalBush/jquery.maskedinput/jquery.maskedinput-1.3.min.js"></script>

<style>
label, input { font-size: 20px; padding: 10px; float: left; clear: both; } input { border: 1px solid #333;
</style>
</head>
<body>
<h1>
<p>Máscaras para campos HTML utilizando jQuery </p>
<form action="#">
<label for="campoData">Data:</label>
<input id="campoData" type="texto">
<label for="campoTelefone">Telefone:</label>
<input id="campoTelefone" type="texto">
<label for="campoCpf">CPF:</label>
<input id="campoCpf" type="texto">
<label for="campoCnpj">CNPJ:</label>
<input id="campoCnpj" type="texto">
</form>
<script>
//insere nos respectivos campos a máscara
jQuery(function($){
$("#campoData").mask("99/99/9999 99:99:99");
$("#campoTelefone").mask("(99) 999-9999");
$("#campoCpf").mask("999.999.999-99");
$("#campoCnpj").mask("999.999.999/9999-99");
});
</script>
</body>
</html>

Javascript: Restringir caracteres, tamanho e formatar campo de data, cpf e telefone

Nesse post vou mostrar algumas funções prontas com javascript que muito atrapalham e fazem todo desenvolvedor Java perderem muito tempo no dia-à-dia, por não se tratar especificamente da nossa área. Para ajudar vou postar as funções que podem ser copiadas e usadas sem perda de tempo.

Sempre estamos fazendo formulários e nesses formulários precisamos inserir campos como data, data e hora, telefone, cpf, entre outros.

O problema é que não podemos colocar somente o campo lá e aceitar que o usuário digite de qualquer jeito. Para isso podemos usar o Javascript ou JQuery para guiar os usuário a preencherem como desejamos ou como o dono do software deseja que seja inserido os dados.

A forma de fazer isso mais fácil é com JQuery sem dúvidas, clique aqui. Mas como nem sempre estamos em um projeto que tem JQuery e também não podemos inserir podemos usar também o Javascript para fazer a mesma coisa de um jeito um pouco mais difícil, explicação abaixo.

Abaixo segue forma de validar cada tecla pressionada no teclado e apenas permitir as que convém para o campo em questão DATA (somente números) os demais dígitos o javascript coloca. Para baixar o arquivo, clique aqui.

<html>
<head>
<title>Mascara de datas</title>
<script language="JavaScript" type="text/javascript">
            //valida tamanho, tipo caracteres e formata
// campo quando foco sair do campo (onBlur)
   function validaDadosOnBlur(tipo, obj, evento)
            {         
            //aqui podem ser inseridos outras validações (cpf, telefone, outros)
            if (tipo == 'datahora')
                        {
                                   //pega somente os valores numéricos do campo
                                   var campo = obj.value.replace(/\D+/g, '');
                                   //valida se tem até 14 caracteres relativos
//à máscara 00/00/0000 00:00:00
                                   if(campo >= 14){
                                               campo = campo.substring(0,14);
                                   }
                                   obj.value = campo;
                                   //formata campo com a máscara passada
                                   formataCampo(obj, '00/00/0000 00:00:00', evento);
                        }
                        return true;
            }

            //valida tamanho, tipo caracteres e formata campo
//quando uma tecla é pressionada (onKeyPress)
            function validaDados( tipo, obj, evento )
            {
                        //pega a tecla que foi pressionada,
//funciona em todos os navegadores (browsers)
                        var nTecla = 0;
                        if (document.all) {
                                   nTecla = evento.keyCode;
                        } else {
                                   nTecla = evento.which;
                        }
                       
                        //se as teclas direcionais ou backspace (apagar)
// sai do método sem executar o restante do método
                        if(nTecla == 0  || nTecla == 8){
                                   return true;
                        }
                       
                        //aqui podem ser inseridos outras validações
//(cpf, telefone, outros)
                        switch ( tipo ) {
                          case "datahora":
                          {
                                     //valida se apenas teclas numéricas foram inseridas
                                     if ( (nTecla >= 48 && nTecla <= 57)){
                                               var campo = obj.value.replace(/\D+/g, '');
                                               //valida se tem até 14 caracteres relativos
//à máscara 00/00/0000 00:00:00
                                               if(campo.length >= 14){
                                                           obj.value = obj.value.substring(0,19);
                                                           return false;
                                               }
                                               //poe o campo em um objeto de escopo global
                                               campoParaFormatar = obj;
                                               //seta para executar o método formataCampo 10 milésimos
// de segundo após acabar a execução
//do método atual (validaDados)
                                               //pois somente após esse método retornar true o valor
// preenchido pelo usuário será inserido no campo
                                               //e a formatação deve ocorrer após o valor já estar no
//campo
tempo = setTimeout("formataCampo(campoParaFormatar, '00/00/0000 00:00:00')",10);
                                               return true;
                                     }
                                     return false;
                                    
                                     break;
                          }
                        }
            }
            //método usado para formatar qualquer campo com a devida Mascara desejada
            function formataCampo(campo, Mascara) {
                                  
                                   if(campo.value == undefined){
                                               return false;
                                   }
                                  
                                   var boleanoMascara;
                                   var posicaoCursor = campo.selectionStart;
                                   var itensInseridos = 0;
                                   var tamanhoPreenchido = campo.value.length;
                                   var posicaoCampo = 0;   
                                   var NovoValorCampo="";
                                  
                                   exp = /\-|\.|\/|\(|\)|\:| /g;
                                   campoSoNumeros = campo.value.toString().replace( exp, "" );
                                  
                                   var TamanhoMascara = campoSoNumeros.length;
                                  
                                   for(i=0; i<= TamanhoMascara; i++) {
                                           boleanoMascara  = ((Mascara.charAt(i) == "-") || (Mascara.charAt(i) == "."));
                                           boleanoMascara  = boleanoMascara || ((Mascara.charAt(i) == "/") || (Mascara.charAt(i) == ":"));
                                           boleanoMascara  = boleanoMascara || ((Mascara.charAt(i) == "(") || (Mascara.charAt(i) == ")"));
                                           boleanoMascara  = boleanoMascara || (Mascara.charAt(i) == " ");
                                                           if (boleanoMascara) {
                                                                       if(campo.value.charAt(i-itensInseridos) != Mascara.charAt(i)){
                                                                             if( i <= posicaoCursor+itensInseridos){
                                                                                  itensInseridos++;
                                                                             }
                                                                       }
                                                           }
                                   }
                                  
                                   for(i=0; i<= TamanhoMascara; i++) {
                                           boleanoMascara  = ((Mascara.charAt(i) == "-") || (Mascara.charAt(i) == "."));
                                           boleanoMascara  = boleanoMascara || ((Mascara.charAt(i) == "/") || (Mascara.charAt(i) == ":"));
                                           boleanoMascara  = boleanoMascara || ((Mascara.charAt(i) == "(") || (Mascara.charAt(i) == ")"));
                                           boleanoMascara  = boleanoMascara || (Mascara.charAt(i) == " ");
                                                           if (boleanoMascara) {
                                                                                  NovoValorCampo += Mascara.charAt(i);
                                                                                    TamanhoMascara++;
                                                                                    if(tamanhoPreenchido <= posicaoCursor){
                                                                                              itensInseridos++;
                                                                                    }
                                                           }else {
                                                                                  NovoValorCampo += campoSoNumeros.charAt(posicaoCampo);
                                                                                  posicaoCampo++;
                                                             }             
                                     }     
                                   campo.value = NovoValorCampo;
                                   campo.selectionStart = posicaoCursor + itensInseridos;
                                   campo.selectionEnd = posicaoCursor + itensInseridos;
                                   return true;
            }
</script>
</head>

<body>

<form>
<!--campo html de data com duas chamadas javascript “onKeyPress” que irá
//chamar a função validaDados e “onBlur” que irá chamar validaDadosOnBlur-->
 <input id="dataInicio" name="dataInicio" type="text" style="width: 200px" value=""
 onkeypress="return validaDados( 'datahora', this, event );" onBlur="validaDadosOnBlur('datahora', this, event);">
Ex: dd/mm/aaaa hh:mm:ss
</form>
</body>
</html>

quarta-feira, 15 de agosto de 2012

Rotina de um programador Java

Dúvidas que podem surgir em quem está começando a trabalhar com programação web:

1 - Existe muita vaga para trabalho?
R: Sim, existe, mas para cada cargo existe mais que para outros. 
   Geralmente,  estagiário é o que mais sofre, pois normalmente não tem experiência e a quantidade de vagas é mais modesta. 
   Já para os cargos efetivos considero que tem muitas vagas, mas isso pode variar de cidade para cidade, as mais fáceis são Rio de Janeiro e São Paulo.
   Para os cargos de Pleno e Sênior a pessoa consegue emprego mais fácil devido à falta de profissionais no mercado. E até consegue negociar alguns benefícios na hora da contratação (horário flexível, trocar ticket refeição por alimentação, o salário já deve ser o que "deseja" para não ter que pedir aumento nos primeiros meses, etc...) não deixe para depois para negociar, pois depois que você é um funcionário negociações se tornam maís difíceis.

2 - É fácil trabalhar com Java?
R: Trabalhar com programação em geral não é o mais fácil dos trabalhos. Mas se gosta de programar e raciocinar o tempo todo, essa é uma boa opção de emprego. Mas respondendo a pergunta, não é fácil. Se quiser trabalhar com algo que não de dor de cabeça, procure outra área de atuação. Outra diferença dessa profissão é a necessidade de estudar constantemente, pois os projetos usam tecnologias diferentes e que talvez você não domine, então terá que estudar para dar conta de cada framework novo que precisar usar, servidores, banco de dados, além de ter que dominar o trabalho acumulado do Analista de requisito, Arquiteto de Software, Web Design e Analista de Teste.

3 - O que faz um programador no dia-a-dia?
R: Um programador deveria programar, mas na verdade acaba trabalhando como um analista de sistemas, com um pouco de requisito, teste, web-designer, etc.. 
   Digo isso porque as empresas de maneira geral, nem sempre possuem todos esses profissionais em seu quadro, e, portanto acaba ficando nas mãos do desenvolvedor essas responsabilidades.
   Então basicamente, o trabalho é o seguinte:
   - Analisar os pedidos do cliente (muitos incompreensíveis) para decifrar o que realmente deve ser feito (deveria ser o trabalho de um Analista de requisito).
   - Calcular uma estimativa de tempo e trabalho para ser aprovado pelo cliente (Arquiteto de Software).
   - Elaborar os documentos com o que será feito (Analista de requisito) e às vezes um protótipo (Web Designer).
   - Realmente fazer o que foi pedido (Programador).
   - Testar o que foi feito, tentando encontrar todos os erros, para quando entregar estar perfeito e fazer mais documentos de teste e evidências (Analista de Teste).

4 - Como são os projetos que utilizam Java?
R: Os projetos que usam Java são em sua maioria de médio e grande porte, portanto os clientes são empresas grandes e que desejam um sistema único que não pode ser comprado no mercado e quase sempre são sistemas que nunca ficaram prontos, não significa que não será usado, pelo contrário, começaram a ser usado sem ter sido concluído e com o tempo novas solicitações serão feitas para alterações e até nova funcionalidades. Na maioria das vezes será com o máximo de burocracia possível e regras de negócio. Existe até metodologia na área de TI para minimizar essa burocracia (tipo Scrum), mas em minha opinião, se não tive alguém com experiência na metodologia pode até atrapalhar, aprender durante um projeto provavelmente será desastroso, só usar se algum líder da equipe já tenha conhecimento para isso.
   Enfim vou citar exemplos de sistemas que já trabalhei lógico sem citar nomes.
  
    - Sistema de geração de boletos através do portal da empresa de plano de saúde. Utilizava as seguintes tecnologias: JSF, RichFaces, JBoss Seam, JDBC, Javascript, CSS e HTML. Servidor JBoss. Banco Oracle.

   - Sistema de gerenciamento de obras de um órgão público. Utilizava as seguintes tecnologias: Um framework proprietário, Struts Um, JQuery, Javascript, CSS, HTML, Hibernate, JDBC, Spring. Servidor JBoss. Banco SQL Server e Postgrees.

   - Sistema de gerenciamento de processos jurídico de uma seguradora. Utilizava as seguintes tecnologias: Struts Um, EJB, JDBC, Javascript, CSS, HTML. Servidor WebSphere. Banco DB2.

   - Sistema de gerenciamento de licitações de uma empresa pública. Utilizava as seguintes tecnologias: Um framework proprietário, Struts Um, JDBC, Javascript, CSS, HTML. Servidor WebLogic. Banco Oracle.

Se tiverem mais dúvidas postem nos comentários que terei o prazer de incluir nesse post as informações solicitadas.

segunda-feira, 13 de agosto de 2012

Aprenda a mover, copiar e apagar arquivos utilizando o Java

Programando em Java, podemos ter que manipular arquivos físicos, tais como: criar, mover, copiar, apagar.
Para mover e renomear arquivos basta usar com método renameTo() da classe File.
Para copiar é um pouco mais complexo, para facilitar segue abaixo dois métodos copy() que executam essa tarefa de forma diferente. Coloquei um print no log para analisar a velocidade da execução e o segundo copy foi mais eficiente. Mas ambos funcionam, faça seus testes.
O primeiro método é mais tradicional e mais estável, portanto mais usado no dia-à-dia.

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.channels.FileChannel;
import java.util.Date;


public class ManipularArquivos {

    public static void main(String[] args){
      
        String pathExemploOrigem = "C:/Imagem/Koala.jpg";
        String pathExemploDestinoCopiar = "C:/Imagem/Copy1/Koala.jpg";
        String pathExemploDestinoCopiar2 = "C:/Imagem/Copy2/Koala.jpg";
        String pathExemploDestinoRenomear = "C:/Imagem/Copy/Coala.jpg";
      
        File arquivoExemploOrigem = new File(pathExemploOrigem);
        File arquivoExemploDestinoCopiar = new File(pathExemploDestinoCopiar);
        File arquivoExemploDestinoCopiar2 = new File(pathExemploDestinoCopiar2);
        File arquivoExemploDestinoRenomear = new File(pathExemploDestinoRenomear);
      
        try {
          
            //Primeiro modo de copiar o arquivo de um local para outro
            copy(arquivoExemploOrigem, arquivoExemploDestinoCopiar);
          
            //Segundo modo de copiar o arquivo de um local para outro
            copy(arquivoExemploOrigem, arquivoExemploDestinoCopiar2, true);
          
            //Renomear ou mover um arquivo
            //Se não alterar a pasta, o sistema apenas renomeia
            //Se alterar a pasta, o sistema move o arquivo e renomeia
            arquivoExemploDestinoCopiar.renameTo(arquivoExemploDestinoRenomear);
          
            //Apagar um arquivo
            arquivoExemploDestinoCopiar2.delete();
          
        } catch (IOException e) {
            e.printStackTrace();
        }
      
    }
  
    /**
     * Copia arquivos de um local para o outro
     * @param origem - Arquivo de origem
     * @param destino - Arquivo de destino
     * @param overwrite - Confirmação para sobrescrever os arquivos
     * @throws IOException
     */
    public static void copy(File origem, File destino) throws IOException {
        Date date = new Date();
        InputStream in = new FileInputStream(origem);
        OutputStream out = new FileOutputStream(destino);          
        // Transferindo bytes de entrada para saída
        byte[] buffer = new byte[1024];
        int lenght;
        while ((lenght= in.read(buffer)) > 0) {
            out.write(buffer, 0, lenght);
        }
        in.close();
        out.close();
        Long time = new Date().getTime() - date.getTime();
        System.out.println("Saiu copy"+time);
    }
  
    /**
     * Copia arquivos de um local para o outro
     * @param origem - Arquivo de origem
     * @param destino - Arquivo de destino
     * @param overwrite - Confirmação para sobrescrever os arquivos
     * @throws IOException
     */
    public static void copy(File origem, File destino, boolean overwrite) throws IOException{
        Date date = new Date();
       if (destino.exists() && !overwrite){
          System.err.println(destino.getName()+" já existe, ignorando...");
          return;
       }
       FileInputStream fisOrigem = new FileInputStream(origem);
       FileOutputStream fisDestino = new FileOutputStream(destino);
       FileChannel fcOrigem = fisOrigem.getChannel();  
       FileChannel fcDestino = fisDestino.getChannel();  
       fcOrigem.transferTo(0, fcOrigem.size(), fcDestino);  
       fisOrigem.close();  
       fisDestino.close();
       Long time = new Date().getTime() - date.getTime();
       System.out.println("Saiu copy"+time);
    }
}

Validar data e hora em Java

 Segue abaixo método que valida se uma data é válida ou não, se foi preenchida ou não.
 Valida data com ou sem hora e se data é válidas, hora é válidas, considerando ano bissexto.
 Basta copiar esse método (isValidDate e  isEmpty) no seu códido e usar!

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.GregorianCalendar;

public class ValidaData {

    //Teste do método abaixo isValidDate
    public static void main(String[] args){
        String dataASerValidada = "30/08/2012";
        String dataASerValidada1 = "29/02/2012";
        String dataASerValidada2 = "29/02/2011";
        String dataASerValidada3 = "31/08/2012 99:11:00";
        String dataASerValidada4 = "31/09/2012";
        String dataASerValidada5 = "01/03/2012 15:30:25";
        String dataASerValidada6 = "";
       
        System.out.println(isValidDate(dataASerValidada, true, false)); // Retorna true
        System.out.println(isValidDate(dataASerValidada1, true, false)); // Retorna true
        System.out.println(isValidDate(dataASerValidada2, true, false)); // Retorna false
        System.out.println(isValidDate(dataASerValidada3, true, true)); // Retorna false
        System.out.println(isValidDate(dataASerValidada4, true, false)); // Retorna false
        System.out.println(isValidDate(dataASerValidada5, true, true)); // Retorna true
        System.out.println(isValidDate(dataASerValidada6, false, false)); // Retorna true
        System.out.println(isValidDate(dataASerValidada6, true, true)); // Retorna false
        System.out.println(isValidDate(new Date(), true, true)); // Retorna true    
    }

    /**
     * Método que valida data com ou sem hora.
     * Verifica datas inválidas, horas inválidas, ano bissexto.
     * @param object Aceita um parâmetro a ser validado que pode ser String ou Date.
     * @param obrigatorio Permite executar validação para campo obrigatório.
     * @param dataEHora Permite definir se a data deve ser validada com hora ou sem hora.
     * @return true(válido) ou false(inválido)
     */
    public static boolean isValidDate(Object object, boolean obrigatorio, boolean dataEHora) {
       
        //Verifica se o objeto passado é string ou java.util.Date
        //Preenche a string a ser usada na validação
        String dataString = null;
        if(object instanceof String){
            dataString = object.toString();
        } else if (object instanceof Date) {
            SimpleDateFormat out = null;
            if(dataEHora){
                out = new SimpleDateFormat("ddMMyyyyHHmmss");
                dataString = out.format(object);
            } else {
                out = new SimpleDateFormat("ddMMyyyy");
                dataString = out.format(object);
            }
        }
           
        //Verifica se é obrigatório e o campo não foi preenchido
        if(obrigatorio && isEmpty(dataString)){
            return false;
        } else
            //Verifica se não for obrigatório e o campo não foi preenchido
            if (!obrigatorio && isEmpty(dataString)){
                return true;
            }
       
        //Retira todos os caracteres que não forem numéricos
        dataString = dataString.replaceAll( "[^\\d]", "" );
       
        //Se campo possui hora, deve possuir pelo menos 14 dígitos
        if(dataEHora && dataString.length() < 14){
            return false;
        }
       
        //Se campo não possui hora, deve possuir pelo menos 8 digitos
        if(!dataEHora && dataString.length() < 8){
            return false;
        }
       
        //Pega os valores do dia, mês e ano
        Long dia = new Long(dataString.substring(0,2));
        Long mes = new Long(dataString.substring(2,4));
        Long ano = new Long(dataString.substring(4,8));
       
        Long hora = null;
        Long minuto = null;
        Long segundo = null;
       
        //Se data tem hora pega os valores de horas, minutos e segundos.
        if(dataEHora){
            hora = new Long(dataString.substring(8,10));
            minuto = new Long(dataString.substring(10,12));
            segundo = new Long(dataString.substring(12,14));
        }
       
        try{
              //Preenche um objeto GregorianCalendar onde a validação acontece
              //Inclusive sobre ano bisexto, dia inválido, hora inválida
              GregorianCalendar data = new GregorianCalendar();
              data.setLenient(false);
              data.set(GregorianCalendar.YEAR, ano.intValue());
              data.set(GregorianCalendar.MONTH, mes.intValue()-1);
              data.set(GregorianCalendar.DATE, dia.intValue());
             
              if(dataEHora){
                  data.set(GregorianCalendar.HOUR_OF_DAY, hora.intValue());
                  data.set(GregorianCalendar.MINUTE, minuto.intValue());
                  data.set(GregorianCalendar.SECOND, segundo.intValue());
              }
             
              // A validação da data ocorre aqui
              // Caso tenha alguma coisa errada com a data o sistema lança exceção
              // Capturada pelo catch abaixo e retorna false
              data.getTime();
            }
            catch(Exception e){
              return false;
            }
            return true;
       
    }
   
    //Método para verificar se string é vazia
    public static boolean isEmpty(String s) {
        return ((s == null) || ("".equals(s.trim())));
    }
}

Convertendo List para Array e Array para List

 Uma grande dúvida que costuma surgir no programadores iniciantes é como transformar um objeto List, ArrayList para Array e vice versa.
Abaixo mostro como fazer os dois casos, caso tenham dúvidas deixem nos comentários.

//Convertendo Array para List
      
   //Criando um array

        //Uma forma é criar o array, já passando os valores.
         String[] nomes = new String[]{"Maria","José","Ana","João"};
           
        //Outra forma seria primeiro declarar os valores e depois preenchê-los
         String[] animais = new String[4];
         animais[0] = "Gato";
         animais[1] = "Pato";
         animais[2] = "Zebra";

   //Uma forma de converter nosso array de nomes para uma lista
    java.util.List nomesLista = new java.util.ArrayList(); 
             
    for(String s: nomes){
        nomesLista.add(s); 
     }
              
    //Outra forma seria utilizando uma biblioteca existente
           
            //Convertendo dessa primeira forma, o array é associado a lista, ou seja,
            //se mais algum objeto for inserido será inserido na lista e no array simultaneamente
            java.util.List animaisLista = java.util.Arrays.asList(animais);
           
                //Se tentarmos inserir mais um item no nosso array que continha uma posição sobrando,
                //o item será inserido também na lista
                animais[3] = "Leão";
               
                //Se tentarmos inserir na lista ocorrerá um erro quando o sistema tentar inserir simultaneamente no array
                //animaisLista.add("Leão"); //Lança uma exceção java.lang.UnsupportedOperationException
           
            //Outra forma seria criar uma cópia desse array e transformá-lo em lista, para ao alterar um não afetar o outro
            //e consequentemente conseguir continuar manipulando a nova lista criada
            java.util.List animaisListaSegundo = new java.util.ArrayList(java.util.Arrays.asList(animais));
            animaisListaSegundo.add("Onça");
    

//Convertendo List para Array
           
     //Criando uma lista
     java.util.List objetosLista = new java.util.ArrayList();
     objetosLista.add("Copo");
     objetosLista.add("Faca");
       
     //Criando um varíavel array e definindo o tamanho da lista como tamanho do array
     String[] objetosArray = new String[objetosLista.size()];
       
        //Convertendo de lista para array, nesse caso o sistema já cria uma cópia
        //e depois de convertido as alterações em uma não afetam a outra
        objetosArray = objetosLista.toArray(objetosArray);
       
           //Inserindo mais um item na lista, esse item não é inserido no array
           objetosLista.add("Colher");