Saturday, February 28, 2009

À tua liberdade

E ainda que digam o contrário, amei-te. De tal intensidade e verdade, que o medo do fim assombrou-me a cada dia da nossa história. Ainda que me dissessem "viva cada dia como se fosse o último", ainda que me dissessem que o fim era certo, essa possibilidade me causava pânico.... Amei-te, e o medo de não te ser suficiente me fez tentar desesperadamente crescer... Amei-te, e é incomensurável a dor de ver-te ir, sem olhar para trás, e com a certeza de que não voltarás, com o mesmo sorriso de antes... E ainda doerá, por um bom tempo, e em todas as vezes em que eu fechar os olhos, na ilusão de ter-te novamente...



E doerá a lembrança do primeiro vinho, das primeiras caipiroskas de morango e kiwi, de te ver brigando com o hashi e com os sushis... Doerá a lembrança do "moço, moço, eu ganhei um namorado hoje!" Doerá a lembrança do primeiro buquê de rosas, das primeiras fotos, do primeiro por do sol... Doerá a lembrança dos primeiros raios da manhã compartilhados entre nós, do teu cheiro, do teu gosto, do teu toque, to teu suor... Doerá a lembrança da tua expressão de saciedade, do teu corpo inerte, do teu sono dos justos... Sangrará ainda mais a lembrança do primeiro "eu te amo"...



Hoje, eu passo os poucos momentos a sós pensando em como isso pode acontecer. O que, talvez, fosse pra durar para um sempre meio duvidoso, aquele em que a gente vai vivendo até que um dos dois decide ir, por achar algo mais completo... Acabou virando o mesmo sempre meio duvidoso, mas aquele em que a gente encerra por um motivo que talvez não precisasse ser tão motivo assim. Fico me perguntando o que faltou, o que sobrou... E quando recaio sobre o que talvez pudesse ser mudado, a única conclusão a que chego é: nada, se o que eu senti foi puro, se as minhas palavras foram todas doces, e os meus gestos foram os mais amenos possíveis. E eu acho que você talvez diga a mesma coisa... Queria que não acabasse. Talvez eu movesse mundos pra que não acabasse, e não seria sacrifício algum... Mas eu acredito que ainda assim não adiantaria.



E se não era pra ser, que ao menos eu possa te desejar sorte. Que no teu caminho, uma luz maior que a nossa te guie, e que te seja abundante a felicidade. Se eu pudesse, talvez eu pedisse a Deus que os nossos caminhos se cruzassem mais uma vez, do mesmo jeito, com a mesma intensidade... Mas eu acho que isso já não cabe mais a mim...



Que a tua nova felicidade possa ser completa, eterna e fulminante.





Por onde quer que eu vá, vou te levar pra sempre...

A vida continua...

Os caminhos não são tão simples,

Temos que seguir...

[1 minuto - Negra Li & D'Black]





E a única coisa que me conforta,
é saber que um dia
Eu fiz parte do mundo de Sofia

Cds Completos de Música





Eu nem deveria ensinar, mas fazer o quê? :D Brincadeira... Você está cansado de se matar procurando sua música favorita na internet? Odeia comprar aqueles cd's cheios de mp3 que os camelôs esparramam pelo chão? Odeia ficar com o eMule e semelhantes abertos o dia inteiro no computador? O seu pior inimigo, o analista de suporte do seu trabalho, adora bloquear rádios online, youtube e outros? Pois seus problemas acabaram!



Aprenda a ser um semi-nerd e use o google pra procurar cd's inteiros dos seus cantores favoritos! Eu já tinha mencionado algo do gênero em outro post, mas eu resolvi formalizar logo de cara.



A maneira mais fácil seria usar esses dois ai, o 4Shared e o RapidLibrary, que já possuem consulta imbutida. Mas e se por obra de sabe lá quem, aquele álbum especial do seu artista favorito não estiver por lá?



É nessas horas que você deveria saber fazer uma query no google... Eu explico. Existem muitos outros sites de hospedagem de arquivos, e só pra começar a lista:





www.filefactory.com

www.4shared.com

www.2shared.com

www.rapidshare.com

www.megaupload.com

www.easy-share.com





Você pode usar o google pra procurar coisas dentro de um site (dominio) específico da seguinte forma:





E tá lá, o próprio google recomenda :)



Se você não quiser lembrar como se faz isso, vai lá na pesquisa avançada







Na maioria das vezes funciona :D Ele lhe trará uma lista de links para download, normalmente arquivos compactados do tipo .rar, .zip e outros. Aí é só você baixar e pronto :) Desse jeito, você também pode procurar aquele e-book (livro eletrônico) que seu professor da faculdade recomendou, funciona do mesmo jeito.



Só não me peçam pra explicar o porquê do código de verificação e/ou contagem regressiva desses sites de hospedagem de arquivos.


Tem outro jeito de pegar cd's inteiros pelo orkut, visitando a comunidade Discografias. Lá o sistema é pesquisar nos tópicos o nome do artista e o cd que se quer. Mas se no seu trabalho o orkut é bloqueado, já sabe né?





Head First - Design Patterns

Como todo e bom nerd, eu uso leitores de feeds. "Hein? Leitor de... de que? Se assunte, homi quá!"



Gente... Alguém ai que não é nerd já ouviu falar de Google? Óóótimo... E de Google Reader? É um bom lugar pra você concentrar aquele blog da caras, da contigo, da galera do Homem É Tudo Palhaço, e até os blogs que postam fotos das emos gostosas, afinal, leitor de feed é unissex!



Daí que eu tinha selecionado um post de um blog qualquer com um livro de Design Patterns (pronto, começou a nerdisse), e um colega de faculdade, Vagner Amaral, me mandou um e-mail perguntando se eu tinha o livro em alguma outra fonte, pois o link do livro naquele post estava quebrado. Fiz o favor de pesquisar em alguns lugares, e achei essa "chéroquis" no scribd



http://www.scribd.com/doc/7380139/Head-First-Design-Patterns



http://www.scribd.com/doc/7378085/Head-First-Design-Patterns



Quem conhece a série da Head First (Use a cabeça, na tradução feita para o português) sabe que a linguagem do livro é extremamente focada para a aprendizagem. Nunca você vai ler um livro desses e achar o texto massante. No máximo, vai ficar cansado por ler por bastante tempo...



E pra ser mais bonzinho ainda, um link melhor (se ele estiver quebrado daqui a alguns dias eu não tenho culpa, não fui eu que hospedei):



http://www.mediafire.com/?vtn0d8zc1ma



Tá ai Vagner :D



Friday, February 27, 2009

Pode Ir

A exemplo da Fundação Cultural da Bahia, mais um site onde se pode procurar por alguma coisa boa pra se fazer nos finais de semana, ou pra tirar a zica da maresia...



www.podeir.com.br 



Não só pra Salvador, mas pra algumas outras capitais também. Entre o conteúdo divulgado, estão filmes, peças, exposições de arte, dentre outros.





Vi no DANOSSE :D



A mim...

A vida realmente parece ser capitalista. E eu não falo em termos financeiros, regados a inflação, FMI, alta do dólar e demais coisas. A vida é mesmo capitalista, e não há ser humano na face desse mundo de meu Deus que já não tenha passado por seus momentos de felicidade e de crise, periodicamente falando.



Olhe para os lados... Veja! Por mais dolorosa que seja a tua crise, pessoas ao teu lado passam por crises semelhantes ou piores. Por mais dolorosa que seja a tua crise, você não estará livre de enfrentar uma pior amanhã. Não adianta enumerar os seus gloriosos feitos, suas qualidades, seus momentos de sorte: nada disso realmente conta quando você acha que precisa. E não adianta se arrepender do que você já tenha feito de certo, errado ou duvidoso, pois você bem sabe, já não há mais volta... "Deus não nos dá carga alguma que não sejamos capazes de suportar".



Se precisar, chore. Seja com os pés, como das vezes passadas, caminhando de Ondina à Boca do Rio durante o crepúsculo... Seja com os olhos, do jeito mais comum, sentado na calçada à noite, olhando a vida corriqueira das pessoas... Seja com os seus dedos, escrevendo em algum canto verdades que você nunca conseguiu interiorizar... Seja com a tua voz, cantando quase aos berros uma música que fale da sua dor ou capricho repentino.



E depois de tudo isso, tenha a certeza de que você é realmente capaz de amar, com todas as suas forças, do jeito mais puro que alguém já foi capaz de amar. Essa é a sua maior virtude...

Thursday, February 26, 2009

SCJP - Anexo I - Dicas para a SCJP

Recebi o link deste blog do meu colega de trabalho, Bruno Fonseca. Daí eu fussei um pouco o blog do Fernando Franzini e acabei encontrando este post lá. Li, e vi que aquelas dicas era TUDO O QUE EU NÃO FAZIA! :D



Pois bem, amigos, realmente é necessário estudar periodicamente. Leiam e incorporem as dicas dele, realmente vale a pena, e faz sentido :)



http://fernandofranzini.wordpress.com/2009/02/10/dicas-para-scjp/

Tuesday, February 24, 2009

Paciência, sofrimento voluntário







Tu és, ó Paciência, um sofrimento
Voluntário, fiel, bem ordenado,
Da conhecida sem razão tirado,
De um constante varão nobre ornamento.
Tu, recolhendo n'alma o pensamento,
Suportas com valor o Tempo irado.
Tu sustentas, com ânimo esforçado,
Todo o peso do mal, no bem atento.
Magnânima tu és, tu és Constância,
Cedro que não derruba a tempestade,
Rocha, onde a fúria quebra o mar com ânsia.
Tu triunfas da mesma Adversidade.
Subjugando as paixões co'a Tolerância,
Tu vences os ardis da vil Maldade.
Francisco Joaquim Bingre, in "Sonetos"




Thursday, February 19, 2009

Supreme Tracks Of Fringles

Tinha que ser o Fausto (vulgo Ero-Senin)... Volta e meia a gente pára pra falar de sacanagem, e uma playlist para essas ocasiões sempre é bem vinda :) Daí eu resolvi dar continuidade ao post anterior e montar uma lista de artistas que eu considero ideal pra algo mais "quente".Antes de mais nada... O que é fringles?



Fingles é sexo. (by Fausto)


Não achei lugar algum no google que me dissesse exlicitamente que fringles significa sexo. No máximo, alguns albuns do flickr, com fotos de garotas mordendo morangos, ou com aquelas calcinhas atochadas que parecem shorts... Então, eu resolvi acreditar no senin, pra variar...





Sexy ela, não?




Bem, lembrando uma vez que eu vi um vídeo/propaganda de uma garota de programa com a música What Goes Around Comes Around, do Justin Timberlake, eu acredito que músicas dele seriam boas pra começar. Existe até um álbum dele com nome sugestivo: Future Sex/Love Sounds. Vale a pena dar uma ouvida nisso.



Aí as meninas vão querer algo, digamos, mais leve... Eu escolheria Rihanna pra dar uma amenizada. Acho que as meninas gostariam de fazer um strip tease com Rihanna, tem um ritmo dançante bem próprio pra isso. Volta e meia eu leio sobre os discos de Sade, para essas ocasiões. É um estilo meio dançante, meio leve, voz sensual... Não é algo pra putaria. É algo pra sexo com alguém com quem se tem o mínimo de afeto.



Tá, eu sei, eu disse que não ia colocar músicas específicas, mas eu acho que essa vale a pena. É clássica! Quem ouve até pensa que foi gravada enquanto o casal de cantores estava transando. Eu estou falando da Je T'aime Moi Non Plus, interpretada por Serge Gainsbourg e Jane Birkin. Dizem que ela foi proibida em portugal, por ferir "a moral e os bons costumes"... Até a letra da música é bem sugestiva...



Agora eu tenho que dar créditos ao meu irmão (Thiago Soriano - Vulgo Sory Love). Outro dia ele me apareceu com Chris Brown no PC. Acho que minha prima também trouxe um DVD dele quando foi lá em casa, cheio de clipes do cara. No começo, eu pensava que era só mais um artista de hip rop, querendo imitar um pouco o Michael Jackson no clip do Thriller. Mas depois que eu baixei alguns cd's pra ouvir, eu tive plena certeza de que rola fazer sexo ouvindo isso :) Também tem gente que gosta de ouvir Beyonce pra algo mais picante. É só dar uma olhada nos clipes dela no youtube pra sentir perder um pouco da noção das coisas ("poxa, que coxa...")





Bem, é nessas horas que eu acho que o ritmo vale mais do que a letra da música, justificando o "pouco importa" que todo mundo fala. É quase como música de academia. Imagina você malhando e ouvindo música gospel. Rola?



Round Two. Ready... Fight!

Wednesday, February 18, 2009

Homem de verdade...

Hoje eu acordei com umas idéias meio toscas na cabeça... Fiquei aqui imaginando quando é que alguém se reconhece um homem de verdade. Sim, essa é uma pergunta que eu nunca havia me feito antes (eu acho). E nem falo dos tantos tipos de homem existentes, que variam do sensível ao bruto, discutidos em tantos outros blogs por ai (como o Papo de Homem, o Manual do Cafajeste e outros mais).



Com certeza, não é quando se descobre que há um certo volume a mais entre as pernas. Isso eu descobri ainda criança, quando eu perguntei à minha mãe "o que é aquele negócio rachado ali no meio das pernas da Aninha". Também não é quando se descobre que sai esperma dele. Tá, tudo bem, essa é uma das maiores descobertas do mundo masculino: o orgasmo.  Também não me vi um homem mais completo depois que perdi minha virgindade. Apesar de ter sido um dos dias mais engraçados da minha vida, não senti nada diferente, além da necessidade de manter uma vida sexual ativa depois disso.



Parece que as coisas realmente tomam seu devido valor quando se agrega responsabilidade às nossas vidas. Negativo, eu não estou falando de filhos. Eu falo de acordar cedo, pegar um ônibus lotado, trabalhar das oito às dezessete (possivelmente ouvindo coisas que não lhe agradam tanto assim), contribuir financeiramente dentro de casa, pagar suas contas, manter uma vida social razoavelmente satisfatória. Você passa a ser capaz de realizar pequenos caprichos, como finalmente poder dividir a conta do bar com os seus colegas de faculdade. Agora você também pode comprar o celular da promoção na TV, com um plano de minutos suficientemente grande, pra você não sentir necessidade de se comunicar via torpedos com a mulher dos seus sonhos. Até dá pra se sentir o máximo, parado na frente da seção de camisinhas da farmácia...



E sim, eu também falo de manter um relacionamento afetivo com uma mulher, se esforçar pra suprir as necessidades dela enquanto mulher, as suas enquanto homem, e as de ambos, enquanto casal. E a gente faz aquela força incrível pra não pensar só na gente, ali, na cama... Falo de quando se consegue ter personalidade o suficiente para ceder, e para exigir, quando necessário. É difícil se manter firme, e ao mesmo tempo tirar as idéias malucas de uma cabeça confusa (a dela e, talvez, a sua também), aturar algumas patadas de mulher em TPM, enchugar as lágrimas dela nos momentos difíceis e ao mesmo tempo resolver os próprios problemas (pequenos ou enormes, não importa).



E depois de pensar nisso tudo, eu ainda fico me perguntando: eu realmente sou um homem de verdade?

Tuesday, February 17, 2009

SCJP - 02 - Casting

Tá... é só colocar um tipo entre parênteses antes da referência e pronto, tá feito o cast. Mas é só isso? Não dá erro? Se dá, quando dá? Se dá, por quê dá?



Ao efetuar um cast, podem ocorrer erros em tempo de compilação e em tempo de execução. Tudo o que o compilador consegue fazer é analisar se o tipo de chegada (a nova referência) e o tipo de partida (aquele que queremos transformar) estão, pelo menos, na mesma árvore de herança.





class Base {}

class Derivada extends Base{}

public class Principal {
public static void main (String[] args) {
Derivada derivada = new Derivada();
Base base = derivada;
}
}


Bem, porque isso funciona? Tá, nós estamos carecas de saber que isso é um upcast. Up o que? Tá viciado em RPG homi? Tá bom, tá bom... Bem devagar.



Downcast: conversão de um tipo genérico para um tipo mais específico.

Upcast: conversão de um tipo mais específico para um tipo genérico.


E aí a gente começa a entender. Upcasting é feito de maneira automática, como a gente já sabe (disso eu tenho certeza). E então, quando ocorre um downcasting?



class Base {}
class Derivada extends Base{
public void teste() {
System.out.println(
"Método da classe Derivada");
}
}

public class Principal {
public static void main(String[] args) {
Base[] arrayBase = {
new Base(),
new Derivada(),
new Base()};

for (Base base : arrayBase) {
if (base instanceof Derivada) {
Derivada derivada = (Derivada) base;
derivada.teste();
}
}
}
}


Consegue entender aquela condicional ali? Bem... é ali que ocorre um downcasting. Até agora, só vimos situações em que as conversões ocorrem perfeitamente bem, sem erros. E quando os erros ocorrem?



Base base = new Base();
Derivada derivada = (Derivada) base;


Bem vindo ao primeiro erro. Veja que a classe Base e a classe Derivada fazem parte da mesma árvore de herança (será que dá pra abstrair o nome das classes?). Então, pelo compilador, passa. Mas quando se executa o trecho de código acima, somos apresentados a uma nova classe: java.lang.ClassCastException. Mas por quê? Ué, a variável de referência base não "aponta" para um objeto do tipo Derivada. Só por isso.



E agora, vamos ao segundo erro.



Base base = new Base();
String string = (String) base;


Nada a ver não é? Esse erro é capturado logo em tempo de compilação, já que o compilador consegue averiguar que Base e String não fazem parte da mesma árvore de herança. Acontece um erro mais ou menos parecido com:



inconvertible types


Para o exame, é necessário saber reconhecer quando é necessário fazer um cast, e que tipos de erro (em tempo de execução e em tempo de compilação) podem ocorrer. Para o dia a dia, é importante fazer um teste do tipo instanceof antes de qualquer downcast.



Monday, February 16, 2009

SCJP - 02 - Métodos sobrecarregados (Overloading)

É, eu também confundia as duas coisas. Overriding é, de forma simplificada, quando você altera o comportamento de um método herdado. Você redefine o método, com o mesmo nome identificador e lista de parâmetros, com base nas regras do post anterior.



Overloading, no entanto, é quando você usa o mesmo nome identificador, mas diferentes tipos de retorno, lista de parâmetros e modificadores de acesso.





class Base {
public String metodo() {
return "apenas um teste na classe base";
}

protected String metodo(Integer numero) {
return numero.toString() + " integer";
}

String metodo(String string) {
return string;
}
}

class Derivada extends Base {

public String metodo() {
return "apenas um teste na classe derivada";
}

public String metodo(boolean teste) {
if (teste) {
return "verdadeiro";
}

return "falso";
}

protected String metodo(Short numero) {
return numero.toString() + " short";
}
}

public class Principal {
public static void main(String[] args) {
Derivada derivada = new Derivada();
Base base = derivada;

System.out.println(
base .getClass().getName() +
": " + base .metodo());

System.out.println(
derivada.getClass().getName() +
": " + derivada.metodo(1));

System.out.println(
derivada.getClass().getName() +
": " + derivada.metodo(true));

}
}


No exemplo acima, o método método é tanto sobrecarregado quanto sobrescrito na classe derivada. E seguindo as regras discutidas nos posts anteriores, não sentimos dificuldades ao concluir que a primeira saída é dada pela versão sem parâmetros do método método, sobrescrita na classe derivada.



Mas as coisas já complicam quando tentamos analisar a segunda saída. O literal 1 é um Integer ou Short? Copie e compile. Pra mim, bateu Integer. Daí eu fui pesquisar, e achei:



int is the default data type of an integer literal. [www.javaying.com]


E daí, concluímos que o literal 1 foi automaticamente convertido para um Integer, e então, a versão do método na classe base foi chamada.



class Base {}

class Derivada extends Base {}

public class Principal {

public void analizaObjeto(Base base) {
System.out.println("objeto da classe base");
}

public void analizaObjeto(Derivada derivada) {
System.out.println("objeto da classe derivada");
}

public void analizaObjeto(Object objeto) {
System.out.println("é um objeto");
}

public static void main(String[] args) {
Principal principal = new Principal();

Derivada derivada = new Derivada();
Base base = derivada;

principal.analizaObjeto(base);

}
}


Você gafanhoto se perguntaria qual das saídas o programa exibiria. É relativamente fácil (eu sempre quis dizer isso :P). Quando se fala de sobrecarga, o que interessa é o tipo definido pela referência, e não o tipo da instância. Até agora, nos meus nossos estudos, a única coisa que leva em consideração o tipo da instância é a chamada de métodos sobrescritos. A resposta da pergunta seria:



objeto da classe base


A versão do método sobrecarregado a ser chamado é decidida em tempo de compilação, com base no tipo declarado pela referência passada por parâmetro.



Friday, February 13, 2009

Artistas pra se ouvir fazendo amor.



Tem uma porrada de blogs onde essa questão aparece. E tem uma porrada de sugestões. Claro, com a onda dos ipod's e mp3,4,5,6,...,n, todo mundo tem uma playlist separada, bonitinha, pra cada ocasião. Ou no mínimo, uma pastazinha com músicas escolhidas a dedo.





A gente sabe que aquela música em especial mexe com a gente. E que a maioria dos casais tem a sua música. E pra completar a seleção, a gente faz um enxerto! :D Mas eu queria fazer algo diferente. Queria não uma seleção de músicas específicas, mas sim uma seleção de artistas, daquelas que a gente fecha os olhos, clica num ponto da tela com o mouse e aperta enter pra tocar, e não se arrepende.



Daí eu decidi procurar mais, e achei o John Mayer. Gostei dos arranjos de guitarra, to timbre de voz do cara, e baixei alguns cd's pra mim (não me peçam pra por link, vão no www.4shared.com ou no www.rapidlibrary.com pra dar uma fuçada)



E esses dias, eu acabei lembrando de Nanda (amiga de faculdade). Ela me apresentou à obra de CéU. Poha... Só de ouvir CéU cantando Lenda me deu vontade de anexar as músicas à minha playlist :D



E lá ia eu esquecendo da Norah Jones... Eu não sei como ela consegue fazer um jazz piano tão gostoso de se ouvir... Sempre que eu a ouço, eu só consigo imaginar meia luz e vinho tinto suave (o mais suave possível). Quem sabe umas uvas também... Tem gente que também gosta de ouvir Joss Stone nessas horas. Eu já acho que ela tem músicas um tanto mais agitadas, um timbre de voz mais agudo se comparado à Norah, mas não é de se descartar não.



Tem uma pá de outros artistas que eu gostaria de ouvir nesses momentos Ai eu lembro que eu os ouço todos os dias, então perde um pouco a graça: Lenine, Ana Carolina, Fabio Júnior, Brian McKnight (tá, nem tão comum assim, mas todo mundo sabe que eu sou fã desse cara), Mariah Carey, Toni Braxton e alguns outros, mas eu acho que os dois primeiros que eu citei seriam uma sugestão boa e diferente.



Tem gente que diz que entre quatro paredes, a letra da música pouco importa. Mas imaginando que sua mulher lhe diga "hoje eu quero carinho", você não acha que vai precisar demorar um pouco mais nas preliminares? Então, ouvir alguma coisa com letra seria o ideal pra criar o clima né? Depois eu sento (lá ele) com calma pra poder fazer uma seleção de artistas com músicas para algo mais agitado, como um strip tease. Imaginem vocês, cuecas ou não (oO), suas minas com corpete vermelho ao som de... :D





Round One. Ready... Fight!

Friday, February 6, 2009

À Liah...

Não, meu anjo. As coisas não são assim. Existem pessoas que querem o seu bem. E ainda assim, não conseguem te ajudar, porque simplesmente você não se ajuda... Olhe-se no espelho, mas torça pra que ele não se quebre. Passe com cuidado ao lado dos cães de rua, eles sentem a tua vibração, e podem cerrar os dentes como reação. Você sabe bem a mulher que foi, a mulher que está sendo, e a mulher que é capaz de ser. Mas ainda lhe falta a resposta da pergunta: por quem serei?
 
Sim, você sabe a mulher por quem você será. Senão pelos seus amigos (leais, mesmo que a distância), senão pelos seus filhos (que dependerão de você ainda por um bom tempo), senão pelo seu trabalho (de onde você tira - bem ou mal - o que precisa pra continuar comendo, vivendo, e os demais "ando"s, "endo"s e "indo"s da vida)... Se por nenhum deles, o seja, por você.
 
Ninguém será capaz de te ajudar, se você se trancar. E talvez o sentimento de perda, que você diz sentir agora, e antes também, seja decorrente daquela lei universal... A Lei da Atração, a base do tal Segredo. Sim, aquele mesmo segredo que se resume ao Marcos 11:24, aquele a quem você me apresentou qualquer dia desses. Tuas vibrações não atraem apenas coisas, fatos. Elas atraem pessoas. E assim como elas atraem, elas afastam...


Mude a tua vibração. Mude o seu mantra. Mude! Mesmo que não haja mais volta, que talvez não recupere o tempo perdido... Mesmo que tenha que abdicar de coisas valiosas, como lembranças, fotos, conversas, pessoas, eu lhe peço, em seu nome e em nome dEle, mude! E quando o vento espalhar pelos quatro cantos do mundo o cheiro da tua mudança, de algum lugar desse mesmo mundo você ouvirá apenas uma frase, ecoada da mesma forma:


Graças a Deus.

Thursday, February 5, 2009

SCJP - 02 - Métodos Sobrescritos (Overriding)

Novamente, nós temos o costume de nos restringirmos a dadas regras (e apenas elas) da linguagem. No caso da sobrescrita (que é diferente da sobrecarga) de métodos, o que nós estamos acostumados a ver são métodos, tanto na classe base como na derivada, exatamente com a mesma assinatura.





class Base {
public String teste(){
return "teste base";
}
}

class Derivada extends Base {
public String teste(){
return "teste derivada";
}
}


Como vocês podem ver, neste caso, a classe derivada mantém o tipo de retorno, o modificador de acesso e a lista de parâmetros do método sobrescrito. Mas sobrescrita de métodos não se restringe a apenas isso. Existem diversas outras possibilidades, que podem ser analisadas no livro SCJP Sun Certified Programmer for Java 6 Exam.



  1. A quantidade e a ordem de parâmetros do método sobrescrito deve ser exatamente a mesma descrita na classe base, do contrário, você terá um método sobrecarregado.




  2. O tipo de retorno precisa ser o mesmo, ou um subtipo do tipo de retorno declarado no método a ser sobrescrito.




  3. O nível de acesso não pode ser mais restritivo que o descrito no método a ser sobrescrito. O código abaixo exemplifica a situação:









    class Base {
    public String teste() {
    return "classe base";
    }
    }

    class Derivada extends Base {
    protected String teste() {
    return "classe derivada";
    }
    }

    public class Principal {
    public static void main(String[] args) {
    Derivada derivada = new Derivada();
    Base base = derivada;

    System.out.println(
    base.teste());

    System.out.println(
    derivada.teste());

    }
    }


    Notou o porquê disso não ser possível? Bem, vamos por partes. Nós dissemos que não é possível sobrescrever um método usando um modificador de acesso mais restrito. Pense no seguinte. Se eu tenho um método na classe base com um dado modificador de acesso (digamos, public), todas as referências sabem como e onde podem acessá-lo (o  método). E nós também sabemos que dada uma referência, a ela podem ser atribuídos objetos do mesmo tipo, ou de subtipos do tipo declarado pela referência. Até aí tudo bem?



    Tomando isso por base, pense no seguinte: tenha uma referência do tipo base, atribuindo a ela um objeto do tipo derivado. Talvez numa situação semelhante ao código descrito neste item fosse possível, porque se duas classes estão no mesmo pacote, é possivel chamar métodos com nivel de acesso default, protected e private. Mas e quando não for? A referência da classe base espera acessar o método sem problemas, mas quando a máquina virtual invocar o método, notará o problema... FAIL. Assim, pra garantir que SEMPRE seja possível acessar o método sobrescrito da classe derivada, este tipo de situação é barrada em tempo de compilação, com um erro semelhante ao abaixo:












  4. O nível de acesso pode ser menos restritivo que o descrito no método a ser sobrescrito. O código abaixo exemplifica a situação:









    class Base {
    protected String teste() {
    return "classe base";
    }
    }


    class Derivada extends Base {
    public String teste() {
    return "classe derivada";
    }
    }

    public class Principal {
    public static void main(String[] args) {
    Derivada derivada = new Derivada();
    Base base = derivada;

    System.out.println(
    base.teste());

    System.out.println(
    derivada.teste());


    }
    }


    Á saída do programa abaixo é mostrada a seguir:



    De forma oposta à explicada acima, uma referência à classe base espera poder acessar um método da forma especificada pelo modificador de acesso. O método sobrescrito na classe derivada oferece um nivel de acesso maior (com certeza, englobando o nivel de acesso descrito pelo método na classe base), o que não é um problema.














  5. Métodos de instância só podem ser sobrescrito se eles forem herdados pela subclasse. Isso quer dizer que, por exemplo, métodos com modificadores de acesso private e final não podem ser sobrescritos. Ohhhh tiiiooo! Mas por quê? Métodos e variáveis private não são herdados pela classe. Simplesmente se tornam indisponíveis. Além disso, definir o modificador de acesso final num método, como vimos antes, impossibilita que subclasses sobrescrevam o método.




  6. Métodos sobrescritos podem lançar unchecked exceptions (exceções checadas em tempo de execução, aquelas que herdam de RuntimeException), independente deles terem sido declarados no método da classe base. Isso merece uma pausa. Como assim, Bial? Exceções não checadas em tempo de execução são aquelas do tipo IndexOutOfBoundsException (que ocorre quando você itera sobre um array, usando um valor de índice maior que o tamanho do array, por exemplo), ou NullPointerException (dispensa explicações). O código abaixo é um exemplo disso:









    class Base {
    public String teste(int i) {
    return "classe base";
    }
    }

    class Derivada extends Base {
    public String teste(int i)
    throws IndexOutOfBoundsException{
    if (i > 0) {
    return "classe derivada";
    } else {
    throw new
    IndexOutOfBoundsException();
    }
    }
    }


    Tá, eu sei que o código acima não faz sentido nenhum, mas é só um exemplo ;)




  7. Métodos sobrescritos não podem lançar checked exceptions (todas as outras que não herdam de RuntimeException) diferentes ou mais gerais que aquelas declaradas no método original da classe base. Por exemplo: se o método da classe base declarar uma exceção do tipo ParseException (geralmente lançada quando não se consegue transformar uma String numa data, usando o SimpleDateFormat, por exemplo), o método sobrescrito da classe derivada não vai poder declarar um NoSuchMethodException, um Exception ou qualquer outra exceção, a menos que seja derivada de ParseException.




  8. O método sobrescrito da classe derivada pode lançar exceções mais específicas ou ainda menos exceções que o método original da classe base. Por exceções mais específicas, entenda como uma subclasse da exceção especificada no método da classe base. O método sobrescrito pode ainda não lançar uma exceção sequer. O motivo disso é: se você está sobrescrevendo um método, você pode alterar o comportamento dele, de modo que tais exceções sejam desnecessárias. Um exemplo de código, pra entender melhor.









    import java.io.*;
    import java.sql.*;

    class Base {
    public String teste() throws
    IOException, SQLException{
    return "classe base";
    }
    }


    class Derivada extends Base {
    public String teste()
    throws FileNotFoundException{
    return "classe derivada";
    }
    }

    public class Principal {
    public static void main(String[] args)
    throws Exception {
    Derivada derivada = new Derivada();
    Base base = derivada;

    System.out.println(
    base.teste());

    System.out.println(
    derivada.teste());

    }
    }


    Veja que FileNotFoundException é um subtipo de IOException ;)



É bom estar atento a coisas como essas, porque na hora do exame, não vai haver um eclipse instalado, com aquele ícone vermelho na linha da declaração do método, indicando o porquê ele não pode ser sobrescrito :)

Wednesday, February 4, 2009

SCJP - 02 - Polimorfismo



Em termos simples, polimorfismo é a habilidade de um tipo, A, aparecer e ser usado como outro tipo, B. Em linguagens fortemente tipadas, isso normalmente significa que o tipo A deriva, de alguma forma, do tipo B, ou o tipo A implementa alguma interface que representa o tipo B [Traduzido livremente da versão inglesa da Wikipedia]




Lendo a citação acima, e relembrando o post anterior (além de alguns outros conceitos base do java), começamos a pensar melhor sobre polimorfismo. Sabemos que em Java, TODOS os objetos herdam da classe Object. Com isso, todos os objetos em java (exceto os do tipo Object) passam no teste IS-A para o seu próprio tipo e para a classe Object, tornando-os polimórficos. Além disso, mesmo que duas classes não possuam superclasses em comum, mas implementem uma mesma interface, elas podem ser consideradas polimórficas (pois, da mesma forma, passam no teste IS-A para seu próprio tipo e para a referida interface).



É por isso que nós não nos assustamos quando vemos esse tipo de situação:

HashSet a = new HashSet();
Set b = a;
Collection c = a;
Object d = a;


Ignorando o "pra que serve um HashSet/Set/Collection?", note que o tipo de construção acima é perfeitamente possível, e a justificativa é dada na própria API Java:





Com isso, nós começamos a entender as cinco regras básicas sobre polimorfismo em java:



  • Uma variável de referência só pode ter um tipo. Uma vez declarada, o tipo da variável de referência não pode mais ser alterado (embora o objeto a quem ela referencia o possa).

  • Uma referência é uma variável, então ela pode ser reatribuída a outros objetos (a menos que seja declarada como final).

  • O tipo da variável de referência determina quais métodos podem ser invocados no objeto referenciado por ela.

  • Uma variável de referência pode referenciar qualquer objeto de mesmo tipo, ou qualquer objeto de qualquer subtipo do tipo declarado pela variável.

  • Se uma variável de referência é declarada como uma interface, ela pode referenciar qualquer objeto que implemente esta interface.



Mas que p**** é uma variável de referência? Pois bem. O código abaixo declara uma variável de referência.



String referencia = 
new String("Eu sou uma referência");


O código abaixo não declara uma variável de referência.



int a = 1;
boolean ehReferencia = false;


Mesmo com toda essa "facilidade", é preciso tomar alguns cuidados. Você sempre pode acessar um objeto qualquer usando uma referência a um tipo mais geral (sua superclasse ou uma interface implementada pelo tipo do objeto em questão). Mas única coisa tratada em tempo de execução em relação ao objeto são seus métodos de instância. Não os métodos estaticos. Não as variáveis de instância (ou variável membro). Apenas os métodos de instância.



class Base {
//declarado como publico só como ilustração
public int inteiro;

public Base(int inteiro) {
this.inteiro = inteiro;
}

public int getInteiro() {
return inteiro;
}

public void setInteiro(int inteiro) {
this.inteiro = inteiro;
}

public static String quemSouEu() {
return "classe Base";
}
}

class Derivada extends Base {
public int inteiro;

public Derivada (int inteiro) {
super(inteiro);
setInteiro(inteiro);
}

public int getInteiro() {
return inteiro;
}

public void setInteiro(int inteiro) {
this.inteiro = inteiro;
}

public static String quemSouEu() {
return "classe Derivada";
}
}

public class Principal {
public static void main (String[] args) {
Derivada derivada = new Derivada(10);
Base base = derivada;
derivada.setInteiro(5);

System.out.println(
"Derivada.getInteiro() = "
+ derivada.getInteiro());

System.out.println(
"Base.getInteiro() = "
+ base.getInteiro());

System.out.println(
"Derivada.quemSouEu() = "
+ derivada.quemSouEu());

System.out.println(
"Base.quemSouEu() = "
+ base.quemSouEu());

System.out.println("Derivada.inteiro = "
+ derivada.inteiro);

System.out.println(
"Base.inteiro = "
+ base.inteiro);
}
}


O código acima não vai tratar o inteiro da classe Base e o inteiro da classe Derivada como uma coisa só. Declarar a variável de instância inteiro novamente na classe Derivada não sobrescreve a que foi declarada na classe Base. Note o que acontece com os métodos estáticos também.





Outro exemplo relacionado às 5 leis. Veja o resultado da compilação logo após o código.



class Base {}

class Derivada extends Base {
public String soTemNaDerivada() {
return "teste de invocação de metodos";
}
}

public class Principal {
public static void main(String[] args) {
Derivada derivada = new Derivada();
Base base = derivada;

base.soTemNaDerivada();
}
}




O tipo da variável de referência define

que métodos podem ser invocados por ela




Tuesday, February 3, 2009

E quem foi que disse que nerd não samba?



Samba. E samba MUITO! Nada como um bom combustível (cerveja!) pra gente começar a se animar... A percussão do samba tem um efeito curioso na gente. É como se a própria pele pulsasse no ritmo dos diversos instrumentos, e mesmo que você fique parado, invariavelmente seu corpo balança.







A galera da Reduto do Samba

realmente manda muito bem


Isso sem falar que samba é coisa do povão. Por mais que queiram elitizá-lo, ele nunca vai deixar de ser o que é. Onde mais eu veria mulheres com o cabelo (de verdade ou não) cheio de creme, com dentes pustiços (latão tá barato né?), sutiã de cabo de aço, dentes manchados de batom cor de graxa, churrasco de gato e outras coisas características, senão num samba do povão? Brincadeiras à parte, talvez seja mesmo na simplicidade onde a gente consegue encontrar mais diversão.





E é entre essas e outras que eu digo: quem disse que nerd não samba? Se nerd é capaz de fazer prova de banco de dados dançando na cadeira, com banda de samba-rock tocando no pátio do pavilhão de aulas da faculdade, por que não sambaria?





Sim, minha gente, eu estava com os níveis de álcool no sangue relativamente elevados, por tanto, desconsiderem (ou não)


Ah, mas você não é lá muito de beber... Sim, isso é verdade. Mas eu aprendi a receita com uma mulher que a gente encontrou no caminho pro sambão: um comprimido antes, outro depois ;) Dessa vez, sem supercílios rachados em semi-voo/montinho (reforma ortográfica?) ao estilo Matrix (viu Kiko?)



P.S.: Vai ver é por isso que banco de dados é o meu fraco...