sábado, 27 de setembro de 2008
Agora eu sou SCJP!!
quarta-feira, 3 de setembro de 2008
Novidades do Java 5.0: Enums
Um enum pode ser declarado em uma classe própria ou ainda dentro de uma classe. Vejamos como é isso:
Apesar de enum ser um classe (é isso mesmo) um enum não é instanciado diretamente como as outras classes em java (usando new por exemplo), basta chamar uma de suas 'constantes'. A ordem dos elementos de um enum é importante e uma coisa importante também é que nada pode ser declarado antes delas. Bom, você pode declarar variáveis em um enum, mas elas precisam vir após a declaração dos elementos. Por exemplo:
Enums também pode ter construtores. Porém eles não são acessíveis fora da definição do enum. Podemos usar os construtores para inicializar algum tipo de variável ou valor default para um enum. Por exemplo:
Enums também pode ser utilizados com a estrutura de switch. Como no exemplo abaixo:
public enum Luas {
CHEIA, CRESCENTE, MINGUANTE, NOVA
}
.... definição da classe
Luas l = Luas.NOVA;
switch(l) {
case CHEIA: //codigo aqui
case CRESCENTE: //codigo aqui
case MINGUANTE: //codigo aqui
case NOVA: //codigo aqui
default: //codigo aqui
}
Até o próximo post.
terça-feira, 2 de setembro de 2008
Novidades do Java 5.0: Varargs
public int somar(int a) {
return a;
}
public int somar(int a, int b) {
return a + b;
}
public int somar(int a, int b, int c){
return somar(a,b) + c;
}
...
O problema é que para conseguir suportar mais argumentos você teria que criar mais métodos sobrecarregados, tornando a sua classe gigante e difícil de manter. A partir do java 5 ficou muito mais fácil criar essa funcionalidade. Através da sintaxe de argumentos variáveis ou varargs. Então os métodos que nós escrevemos antes ficariam todos resumidos em um método assim:
public int somar(int... args) {
int total = 0;
for (int i = 0; i < args.lenght; i++)
total += args[i];
return total;
}
chamadas válidas ao método
System.out.println(somar()); imprime 0
System.out.println(somar(1)); imprime 1
System.out.println(somar(1,2)); imprime 3
System.out.println(somar(1,2,3)); imprime 6
Acho que você notou que o argumento variável nada mais é que um array de objetos ou de primitivos do tipo informado no parâmetro né? Só que o recurso é mais interessante porque me dá a flexibilidade de passar quantos parâmetros eu quiser sem precisar declará-los em um array. Agora vejamos as regras do varargs:
- Todo vararg tem um tipo definido. Como no nosso exemplo o tipo foi int.
- Para definir que o parâmetro é vararg use ... (três pontinhos) depois do tipo. Cuidado para não confundir com a sintaxe de arrays, ainda não vimos arrays mas vamos adiantar a sintaxe aqui: um array pode ser definido: int[] a ou int a[]. Um vararg só pode ser int... a e NUNCA int a...
- Eu posso ter vários parâmetros junto com o vararg, porém só posso ter um ÚNICO vararg como parâmetro e este precisa ser OBRIGATORIAMENTE o último deles. Assim é válido ter: public void somar(String msg, int... a); mas é inválido: public void somar(int... a , String msg);
Até o próximo post.
Declarando Variáveis de Classe
No post anterior vimos como declarar variáveis locais. Vimos que normalmente o escopo de uma variável local é o método ou a estrutura onde ela foi declarada (por ex. um for) e vimos ainda que elas só aceitam o modificador final.
Agora iremos aprender o que são e como usar variáveis de classe. Uma variável de classe nada mais é do que uma variável que tem o seu escopo na classe na qual ela foi criada. Isso quer dizer que ela vive enquanto a classe estiver viva (ou na memória né...). Você define uma variável como sendo de classe utilizando o modificador static. Uma variável estática pode ser acessada diretamente através da classe, ou seja, eu não preciso ter um objeto (ou uma instância de um) para acessar a variável, só preciso utilizar ClassName.variableName. Vamos dar um exemplo:
Note que não criamos um objeto Carro, simplesmente chamamos a variável cor através da classe Carro (claro que isso foi possível também porque cor é uma variável pública). Você pode também acessar uma variável de classe através de uma instância da classe, pois todas as instâncias compartilharão a mesma variável, já que ela pertence à classe. Então eu sugiro que você sempre acesse via classe mesmo e não via objeto, até para deixar seu código mais claro.
public class Carro {
public static String cor = "Azul";
}
public class TesteCarro {
public static void main(String args[]){
Carro c = new Carro();
System.out.println(Carro.cor); //classe
System.out.println(c.cor); //objeto
}
}
Até o próximo post.
segunda-feira, 1 de setembro de 2008
Declarando Variáveis Locais
- Locais ou de métodos
- De classe
- De instância
public void mostrarNome(String nome) {
int a = 10;
System.out.println(nome);
}
As variáveis 'a' e 'nome' são variáveis locais. O escopo delas está limitado as chaves que abrem e fecham o método mostrarNome. Isso significa que após a última chave, elas simplesmente não existirão. Podemos ter também algo do tipo:
Quantas variáveis locais temos aí? Quem disse 2 acertou na mosca. São elas: 'contador' e 'i'. A variável 'i' é uma variável local também, só que o seu escopo está limitado ao laço for no qual ela foi criada. Então isso significa que esse código não compilaria pois estamos tentando acessar a variável 'i' fora o seu escopo, pois o compilador não enxerga mais a varíavel após a última chave do for. Já a variável contador seria perfeitamente acessível daí, já que o seu escopo é o método todo.
public void contarAte(int contador) {
for (int i =0; i <= contador) System.out.println(i); } System.out.println(i); }
Mas eu falei de modificadores de acesso no começo deste post, o que tem a ver com as variáveis locais? Tem tudo a ver. Ou por que não dizer "não tem nada a ver". Isso porque as variáveis locais só aceitam um único modificador de acesso: final. O modificador final quando aplicado a uma varíavel local diz que o valor da variável não pode ser modificado após a sua inicialização. Então se fizéssemos algo do tipo:
Esse código não compila, pois a varíavel contador não pode ter o seu valor alterado pois ela é uma variável final. O modificador final pode ser usado em java para definir constantes, apesar de uma das palavras chaves da linguagem ser a palavra const, ela não é utilizada. Assim você diz que uma variável é uma constante aplicando a ela o modificador final.
public void contarAte(final int contador) {
contador = 100; //erro
...
}
Para finalizar você precisa saber que uma variável local precisa ser OBRIGATORIAMENTE inicializada antes de ser utilizada. E você precisa garantir que ela o será, caso contrário o seu código não irá compilar.
Você pode achar que o compilador vai ser legal com você e aceitar que se o parâmetro exibe for true a variável resultado será inicializada e poderá ser utilizada. Mas ele não vai aceitar isso. Ele vai reclamar para você que a variável resultado pode não ser inicializada. Lembra que eu falei que você tinha que garantir que ela o seja? Para corrigir o trecho acima basta fazermos:
public void exibeResultado(boolean exibe) {
String resultado;
if (exibe)
resultado = "Fui iniciada?";
System.out.println(resultado);
}
public void exibeResultado(boolean exibe) {Agora sim, o compilador se dará por satisfeito e compilará o seu código. Resumindo o que vimos:
String resultado;
if (exibe)
resultado = "Fui iniciada?";
else
resultado = "Com certeza";
System.out.println(resultado);
}
- Variáveis locais só podem ser marcadas como final.
- Variáveis locais TEM que ser inicializadas antes do seu uso.
Windows Explorer com abas e muito mais
Se você assim como acha que o Windows Explorer do XP é uma porcaria, então esse programa foi feito pra você também! O ExplorerXP permite você navegar nos arquivos e pastas do seu windows e oferece uma série de recursos extras. Você pode clicar aqui e ver as vantagens de usar o software e também pode fazer o download. O programa é bem pequeno (apenas 410KB) e consome pouca memória ao ser ativado. O melhor de tudo é que ele não afeta o seu Windows Explorer. Você pode usar os dois independentemente.