Revistas da Oracle de graça!

Você tem inglês fluênte o suficiênte para ler artigos nesta lingua?
Quer receber as novidades relacionadas a Oracle de graça em sua casa?
A Oracle publica no formato bimestral uma revista e envia pra você! Basta submeter os seus dados neste formulárilo.

Mas lembre-se, a revista virá toda em inglês.

Caso não queira recebe-la em casa, você pode acessar as edições no formato digital (pdf), também gratuitamente por estes endereços:

http://www.oracle.com/technology/oramag/index.html
http://www.oracle.com/oramag/index.html

Mas lembre-se, mesmo a revista em formato digital está em inglês.

http://www.submag.com/sub/oc

Se a revista fala de inglês?
A resposta é sim, na verdade ela fala sobre quaqlquer coisa que interessar a Oracle do ponto de vista tecnológico, esta não é uma daquelas revistas como a InfoExame, destinada a gerentes (traz milhões de propagandas), esta é uma revista bem técnica.

Resumo dos conceitos de Orientação a Objetos

Conceitos fundamentais da Orientação a Objetos:

  • Classe: representa um conjunto de objetos com características afins. Uma classe define o comportamento dos objetos, através de métodos, e quais estados ele é capaz de manter, através de atributos.


  • Estado: O estado de um objeto é determinado pelo conjunto dos valores dos atributos. Para evitar estados inválidos ou inconsistentes e acessos indevidos, os atributos devem ser apenas manipuláveis por operação do próprio objeto.


  • Comportamento: Um comportamento é uma ação executada por um objeto em resposta a alguma mensagem ou mudança de estado. Ele é acionado pela execução de algum método. Entretanto, essa relação não é explícita, já que um mesmo comportamento pode ser implementado por vários métodos. Os métodos são operações (ações) explicitamente detalhadas e codificadas nas classes. O conjunto das operações públicas de um objeto forma a lista de serviços disponibilizados. A esse serviço dá-se o nome de interface do objeto. A interface é um contrato com o mundo exterior, informando o que um objeto pode fazer, mas não sua implementação.

  • Objeto: é uma instância de uma classe. Um objeto é capaz de armazenar estados através de seus atributos e reagir a mensagens enviadas a ele, assim como se relacionar e enviar mensagens a outros objetos.


  • Mensagem: é uma chamada a um objeto para invocar um de seus métodos, ativando um comportamento descrito por sua classe. Também pode ser direcionada diretamente a uma classe (através de uma invocação a um método dinâmico);


  • Herança (ou generalização): é o mecanismo pelo qual uma classe (sub-classe) pode extender outra classe (super-classe), aproveitando seus comportamentos (métodos) e estados possíveis (atributos). Há Herança múltipla quando uma sub-classe possui mais de uma super-classe. Essa relação é normalmente chamada de relação "é um". Um exemplo de herança: Mamífero é super-classe de Humano. Ou seja, um Humano é um mamífero;

  • Associação: é o mecanismo pelo qual um objeto utiliza os recursos de outro. Pode tratar-se de uma associação simples "usa um" ou de um acoplamento "parte de". Por exemplo: Um humano usa um telefone. A tecla "1" é parte de um telefone;


  • Encapsulamento: consiste na separação de aspectos internos e externos de um objeto. Este mecanismo é utilizado amplamente para impedir o acesso direto ao estado de um objeto (seus atributos), disponibilizando externamente apenas os métodos que alteram estes estados. Exemplo: você não precisa conhecer os detalhes dos circuitos de um telefone para utilizá-lo. A carcaça do telefone encapsula esses detalhes, provendo a você uma interface mais amigável (os botões, o monofone e os sinais de tom);



  • Abstração: é a habilidade de concentrar nos aspectos essenciais de um contexto qualquer, ignorando características menos importantes ou acidentais. Em modelagem orientada a objetos, uma classe é uma abstração de entidades existentes no domínio do sistema de software;



  • Polimorfismo: é o princípio pelo qual duas ou mais classes derivadas de uma mesma superclasse podem invocar métodos que têm a mesma assinatura (lista de parâmetros e retorno) mas comportamentos distintos, especializados para cada classe derivada, usando para tanto uma referência a um objeto do tipo da superclasse. A decisão sobre qual o método que deve ser selecionado, de acordo com o tipo da classe derivada, é tomada em tempo de execução, através do mecanismo de ligação tardia. No caso de polimorfismo, é necessário que os métodos tenham exatamente a mesma identificação, sendo utilizado o mecanismo de redefinição de métodos. Esse mecanismo de redefinição não deve ser confundido com o mecanismo de sobrecarga de métodos.

Hibernate Validator - A base para o JSR 303: Bean Validator. Mundo Java Edição nº25, 2007



Na edição 25 da Revista Mundo Java vai sair um artigo meu, espero que seja o primeiro de muitos. :D

O título do artigo é Hibernate Validator - A base para o JSR 303: Bean Validator. Nele falo sobre o Hibernate Validator, e mostro um pouco doque podemos esperar para o Java 7 que ainda esta por vir.

Este recurso de validação é bem interessante e nos traz uma série de beneficios, recomendo a leitura.


http://www.mundojava.com.br/NovoSite/destaque.shtml

link

Sun Certified Java Programmer (SCJP)

Com muito orgulho, que posto este comunicado...

EXTRA EXTRA... DESDE O DIA 24/09/2007 EU SOU O MAIS NOVO CERTIFICADO DA SUN.

Tirei o meu SCJP 1.5 . Pra falar a verdade, achei que não iria passar porque não estudei quase nada, mas.... passei :D


Sun Certified Java Programmer (SCJP)

The Sun Certified Programmer for Java 2 Platform 5.0 certification exam is for programmers experienced using the Java programming language. Achieving this certification provides clear evidence that a programmer understands the basic syntax and structure of the Java programming language and can create Java technology applications that run on server and desktop systems using J2SE 5.0.

This is a exam Objectives:
Sun Certified Programmer for the Java 2 Platform, Standard Edition 5.0 (CX-310-055)


Java.... passagem de parâmetro por referência ou valor?

Vários programadores, experiêntes em outras linguagems, questionam-me sobre como funciona a passagem de parâmetros no Java.

Quando de trata de passagem de Objetos como parâmetros, o mais importante a se lembrar é que não está passando nem mesmo a variável de referência real, mas em vez disso, uma cópia dos bits dessa variável, portanto quando pasar uma variável de referência, estará passando uma cópia dos bits que representam como um objeto específico pode ser acessado. Ou seja, você está passando uma cópia do ponteiro.

Pra entender oque escrevi acima, pense que quando você está passando um objeto como parâmetro você está usando passagem de parâmetros por referência, afinal este é o efeito/comportamento, isto quer dizer que uma alteração no parâmetro dentro do método afetará a variável original.


Quando uma variável primitiva é passada para um método, ela é passada por valor, o que signfica: "passar por cópia dos bits de variável".

Para entender isto, pense que quando trabalhamos com uma variável primitiva, e passamos ela como parâmetro, essa passagem é feita por valor. Isto quer dizer que quando alteramos ela dentro de um método, esta alteração não se reflete na variável original.

Abaixo segue um código para exemplificar o conceito.



package com.gms.valoroureferencia;
import java.awt.Dimension;
public class Teste {
public static void main(String[] args) {
objeto();
primitivo();
}

public static void objeto(){
System.out.println("TESTE DE PASSAGEM DE
PARAMETROS COM OBJETOS");
Dimension dimension = new Dimension(5, 10);
System.out.println("antes d = " + dimension.height);
modify(dimension);
System.out.println("depois d = " + dimension.height);
}

public static void modify(Dimension dim) {
dim.height = dim.height + 2;
System.out.println("dim = " + dim.height);
}

public static void primitivo(){
System.out.println("\nTESTE DE PASSAGEM DE
PARAMETROS COM TIPOS PRIMITIVOS");
int inteiro = 10;
System.out.println("antes inteiro = " + inteiro);
modify(inteiro);
System.out.println("depois inteiro = " + inteiro);
}

public static void modify(int i){
i = i +2;
System.out.println("i = " + i);
}
}

Como ordenar um hashmap pelo valor?

Para ordenar um hashmap, eu poderia converte-lo em um treemap, mas isso iria ordenar as informações pela chave, e não pelo valor.

Como não consegui uma solução mais "automágica" criei um método pra fazer isso...

A idéia é pegar os Entry (conjunto de chave e valor) convertidos em Array, apartir dai, ordenar o array pelo valor do Entry e então recriar o Map, mas dessa vez eu precisaria utilizar o LinkedHashMap para manter a ordem em que os objetos ficaram após a ordenação dentro do array.

Claro que eu poderia retornar o Array ordenado... :D

Ah! Já ia me esquecendo, é necessário que o valor do hash implemente Comparable

Veja o código ilustrativo...

public static Map ordDesc(Map map) {
Object[] entries = map.entrySet().toArray();
Arrays.sort(entries, new Comparator() {

public int compare(Object lhs, Object rhs) {
Map.Entry le = (Map.Entry) lhs;
Map.Entry re = (Map.Entry) rhs;
return (
(Comparable) re.getValue()).compareTo(
(Comparable) le.getValue()
);
}
});

Map h = new LinkedHashMap();
for(int i =0; i < 10; i++){
Map.Entry entry = (Map.Entry)entries[i];
h.put(entry.getKey(), entry.getValue());
}
return h;
}

Aprenda inglês

Um excelente site para os auto didatas aprender inglês, você consegue ouvir uma conversação com legenda, muito bom mesmo, oque é melhor... free :D

http://www.elllo.org/

ClassLoad para carregar de um banco de dados

To load the classes for Data Base you uses these concepts.... :D

Hoje irei postar um código de um amigo, (Fabio vulgo Balão)...
A idéia é carregar um .class apartir de um banco de dados, para conseguir atualizar algumas partes do sistema de forma centralizada, ou seja, dando um update em um registro no banco de dados.

É claro que este código apenas ilustra o conceito, mas ta ai o código do meu amigo Fabio, código que me surpreendeu, pois eu não imaginei que isto seria possível. Mas como diz o ditado: "Não sabendo que era impossível, ele foi lá e fez".

Parabéns camarada, tu me surpreendeu com este código


import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;


class DbClassLoader extends ClassLoader {
private PreparedStatement pstmt;
private ClassLoader parent;

public DbClassLoader(PreparedStatement prepStmtArg) {
super();
this.pstmt = prepStmtArg;
}

public DbClassLoader(PreparedStatement prepStmtArg ,
ClassLoader parentArg) {
super(parentArg);
this.parent = parentArg;
this.pstmt = prepStmtArg;
}

Override
protected Class findClass(String className)
throws ClassNotFoundException {
try {
this.pstmt.setString(1, className);
byte[] classData =
this.pstmt.executeQuery().getBytes(1);
if (classData != null && classData.length > 0) {
return this.defineClass(className, classData,
0, classData.length);
}
} catch (SQLException e) { }

if (this.parent != null)
return this.parent.loadClass(className);

throw new ClassNotFoundException(className);
}

/**
* teste p v se a classe ta funcando
* @param args
*/
public static void main(String[] args) {
try {
Class.forName("org.sqlite.JDBC");
Connection conn =
DriverManager.getConnection("jdbc:sqlite:../teste.db");
String sql = "SELECT data FROM class WHERE class = ?;";
PreparedStatement pstmt =
conn.prepareStatement(sql);
ClassLoader sysClassLoader =
ClassLoader.getSystemClassLoader();
ClassLoader cl = new DbClassLoader(pstmt,
sysClassLoader);
System.out.println(sysClassLoader.getClass().getName());

// Class.forName("SpeedMeterExporterController");
Class controller =
Class.forName("SpeedMeterExporterController", true, cl);
System.out.println(controller.getName());
} catch (ClassNotFoundException e2) {
e2.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
}