Trabalhando com Data em Java

Manipular datas em Java sempre foi um trabalho complicado para os iniciantes e até para os experts, ainda porque muitos métodos da classe java.util.Date já estão depreciados na versão 1.6 e ainda assim não oferece todas as funcionalidades necessárias.

A classe Calendar é utilizada para suprir essas necessidades, tornando possível manipular dias, meses, anos e até segundos.

Continuar lendo

Boas práticas de Programação…

Boas práticas para retornar null ou lista vazia

Quando seu método necessita retornar uma Collection, retorne uma lista vazia ao invés de um objeto nulo.*

Isso evita IF desnecerssários (NullPointerException) e possibilita melhor leitura do seu código.

Não se preocupe em verificar se a lista está vazia, list.size() > 0, o FOR já se encarrega disso.

*Effective Java (2nd Edition)

Boas práticas de Programação…

Boas práticas para comentários

Evite comentários óbvios.  Seu código deve ser auto explicativo, use nomes de variáveis e métodos que representam exatamente o que significam.


// Busca o pais de origem do usuario
String pais = buscarPaisPorIP(ip);

// Verifica se o pais de origem eh o BRASIL
if(pais.equals("BR")
return "Brasil!";

Java – Modificadores de acesso

Os famosos modificadores de acesso em Java são palavras-chave que modificam a forma de como podem ser acessadas as classes, os métodos ou suas variáveis.

Entre eles temos o public, private protected.

Public – Tudo e todos o conhecem

O modificador public faz com que a classe, método ou variável esteja disponível (visível) para tudo e todos do sistema em qualquer momento da execução. Basicamente esse elemento pode ser alterado por qualquer outra classe não importando qual seja e em qual pacote esteja.

Private – Restrição total

O private é exatamente o inverso do public. O membro que for declarado como private poderá ser acessado apenas por sua própria classe.

Normalmente as variáveis private para serem lidas (get) ou alteradas (set) por outras classes do sistema implementam os métodos Gets e Sets para essas variáveis. Demonstrarei alguns exemplos práticos logo mais abaixo.

Protected – Protegido pelo seu pacote

O modificador protected é menos usado, mas mesmo assim importante. Ele seria uma mistura entre o private e o public. Membros de classe protected são visíveis apenas por outros membros de classe de seu mesmo pacote ou por herança.

Exemplo Prático

Vamos demonstrar com alguns códigos práticos o uso desses modificadores de acesso e entender um pouco melhor como utilizar os métodos gets e sets.

Como exemplo utilizarei a classe Carro com alguns métodos e variáveis utilizando os modificadores de acesso citados acima. Preste atenção em qual pacote cada classe está e seus modificadores.

Pacote MeuMecanio
Classe Carro 

package MeuMecanico;

public class Carro {

	public boolean pneuEstaCheio = true;

	private int velocidade;

	protected Motor motorCarro;

	// --- Métodos ---
	public void acelerar(int forca){
		this.velocidade += forca;
	}

	public int getVelocidade(){
		return this.velocidade;
	}
}

Classe Motor

package MeuMecanico;

public class Motor {

	private int qtdValvulas;

	public int getQtdValvulas() {
		return qtdValvulas;
	}

	public void setQtdValvulas(int qtdValvulas) {
		this.qtdValvulas = qtdValvulas;
	}

}

Classe MecanicoConfianca

package MeuMecanico;

public class MecanicoConfianca {

	public void consertarCarro(Carro carro){
		// Motor Consertado
		carro.motorCarro = new Motor();
	}
}

Pacote OutroMecanico
Classe MecanicoConfianca 

package OutroMecanico;

import MeuMecanico.Carro;
import MeuMecanico.Motor;

public class MecanicoConfianca {

	public void consertarCarro(Carro carro){
		// Motor Consertado
		carro.motorCarro = new Motor();
	}
}

Explicação

Supondo que você tem um carro e ele está quebrado. Mas é claro que você não deixa seu carro na mão de qualquer mecânico. Logo o único MecanicoConfianca que pode mexer no motor do seu carro está no mesmo pacote que sua classe Carro. (protected)

A outra classe MecanicoConfianca que está em outro pacote não tem acesso a variável Motor do seu carro, mesmo essa classe ter sido instanciada como public (vide imagem acima).

Vamos comentar um pouco sobre a linha: public boolean pneuEstaCheio = true;

Coloquei essa variável para uma simples demonstração do public. Qualquer Mecanico ou qualquer outra classe não importando seu pacote pode alterar o valor da variável pneuEstaCheio, já que em teoria, qualquer pessoa poderia dizer se um pneu está cheio ou não, logo posso dar permissão public neste elemento. (public)

Outro ponto em questão é: private int velocidade;

No caso dessa variável, ninguém pode alterar o valor da velocidade a não ser o próprio carro com o método acelerar.
Ao mesmo tempo para eu saber a velocidade atual do carro só preciso chamar o método getVelocidade que me retornará a velocidade em questão. (private)

Espero que tenha ajudado!

Confuso sobre como implementar corretamente Strings no seu sistema?
Leia o tópico em que falamos sobre as Diferença entre String, StringBuilder, StringBuffer.
Veja nosso post sobre isso.
Clique Aqui

Evento – Google Developer Day 2011

Vamos divulgar aqui outro evento que acontecerá em São Paulo no Sheraton WTC Hotel dia 16 de setembro.

Google Developer Day 2011

Dia 16 de setembro, em São Paulo, acontecerá o GDD 2011, que contará com 5 principais temas para palestras e batepapos, entre eles o Android, Chrome  e HTML5.

A inscrição é simples bastando apenas informar alguns dados pessoas como telefone, email e endereço. Após esse processo é necessário resolver alguns exercícios de lógica de programação em qualquer linguagem.

Os famosos desafios do Google são bem conhecidos no meio da tecnologia e todo ano eles criam algumas surpresas. Neste ano por exemplo, os desafios são formados a partir de um “pergaminho escrito na linguagem Googlon”. É preciso responder algumas perguntas sobre a quantidade de verbos no pergaminho e depois ordená-los.

Inclusive essa provinha do Google faz parte do processo de inscrição e serve como críterio de seleção dos convidados.

Para quem quiser saber mais acesse o link abaixo.

http://www.google.com/events/developerday/2011/sao-paulo/

O link para a “provinha” segue abaixo:

https://developerquiz.appspot.com/

Talvez para o desafio do google você precise conhecer um pouco mais sobre Strings e StringBuilders.
Veja nossoo post sobre isso.
Clique Aqui

Diferença entre String, StringBuilder, StringBuffer

Para início de conversa, o mais importante a saber sobre objetos da classe String é que eles são imutáveis, ao contrário dos objetos StringBuffer e StringBuilder que são mutáveis.

Um objeto imutável significa que o seu valor não pode ser alterado em nenhuma circunstancia. Ou seja, caso você tenha um objeto String com o texto “A”, nunca mais você poderá altera-lo. Agora provavelmente você se pergunta: “Se String é imutável, então como eu consigo alterar o valor dela em qualquer momento?”.

Mão na massa…

Vamos supor que eu tenho o seguinte código:

String pnf = "Pog";
// Quero concatenar com a string "NotFound";
pnf = pnf + "NotFound";
System.out.println(pnf);

A saida do programa seria “PogNotFound”, apesar de termos usado a mesma variável pnf, internamente o Java se encarregou de criar um novo objeto para guardar a concatenação da variável pnf com a string NotFound. Para demonstrar isso vamos imprimir o seguinte código:

String pnf = "Pog";
pnf.concat("NotFound");
System.out.println(pnf);

E Agora qual o resultado? Apenas “Pog” correto? Isso demonstra que a classe String é imutável, ou seja ela não altera seu valor não importando o método utilizado.
Como resultado, cada operação realizada (concat, substring, trim, replace) com a classe String o Java se encarrega de criar todos esses novos objetos.

Performance

Isso pode causar problemas de performance?
Sim, causa. Vários sites demonstram o tempo gasto pela JVM para lidar com essas operações. Talvez para nosso exemplo a diferença seja insignificante, mas em casos onde temos milhares de Strings sendo concatenadas, pode ser um problemão.

Então como podemos resolver isso?
Fácil, usando o StringBuffer ou o StringBuilder

StringBuilder e StringBuffer

Basicamente tanto a classe StringBuilder e o StringBuffer são mutáveis, e possuem os mesmos métodos. A única diferença é que o StringBuffer é sincronizado (usado quando seus métodos implementam Threads) e o StringBuilder não. Resumindo, caso você não esteja trabalhando com Threads, o método mais eficiente para trabalhar com String é o StringBuilder.

Utilização

Vamos mostrar um exemplo simples de como utilizar o StringBuilder.

public class PogNotFound {

public static void main(String[] args) {
  String s = new String("Pog");
  s.concat("NotFound");
  System.out.println(s);
  // Resultado: Pog

  StringBuilder sb = new StringBuilder("Pog");
  sb.append("NotFound");
  System.out.println(sb);
  // Resultado: PogNotFound
}
}

Caso precise de ajuda em utilizar algumas das classes citadas, por favor deixe um comentário abaixo, será um prazer ajudar!

Dificuldades em comparação de objetos com o operador == e o método .equals() ?
Veja nossoo post sobre isso.
Clique Aqui

Motive sua Equipe!

Para começar, não direciono esse tópico exclusivamente para a área de TI, muito menos para diretores e gerentes da área. O público alvo para este tópico é VOCÊ, jogador de futebol, estagiário de desenvolvedor de software, diretores de grandes corporações, grupos de estudo, entre outros.

Vou começar apontando o erro de qualquer pessoa.

Qual dos dois está MAIS motivado? PENSE!

Gato e Rato

Continuar lendo