Olá, não me perguntem porque eu fico vendo isso, mas as vezes acho umas coisas bizarras no código fonte das api’s.
a primeira é dentro da Classe java.awt.Color, tem um atributo private que não é usado na classe toda, qual a finalidade disso?! para que sera que iriam declarar isso!?
/**
* Private data.
*/
transient private long pData;
A segunda é relacionado ao famoso System.out.print(“hello World”);
O atributo out de System é public, final e estatico do tipo PrintStream, logo ele é iniciado na primeira vez que System aparece e seu valor não muda mais ok?!
A classe PrintStream tem um método chamado
public void print(Object obj) {
Perceba que não é estatico, logo só é acessivel através de uma instancia, que no caso do System.out.print é o atributo out de System. Mas olhando a declaração desse que vem a parte bizarra:
public final static PrintStream out = nullPrintStream();
Olhem o código do método nullPrintStream();
private static PrintStream nullPrintStream() throws NullPointerException {
if (currentTimeMillis() > 0)
return null;
throw new NullPointerException();
}
Ele pode fazer duas coisas
- retornar null
- lançar um NullPointerException
Para mim isso ai vai retornar null sempre… dessa forma, out vai ser null e se out for null, quando ele chamar o método não estatico print de PrintStream, não deveria lançar um NullPointerException?!
Não consigo debugar pq de certo out é iniciado junto com a jvm, ja que é estatico da classe System, mas fazendo uma analogia das chamadas, seria isso:
import java.io.PrintStream;
class System0
{
public static final PrintStream out = nullPrintStream();
private static PrintStream nullPrintStream() throws NullPointerException
{
if (System.currentTimeMillis() > 0) return null;
throw new NullPointerException();
}
}
public class Teste
{
public static void main(String[] args)
{
System0.out.print("oi");
}
}
que é claro da NullPointer…
afinal, alguem entende pq algumas coisas da API do java são assim?! tipo, não seguem a lógica da linguagem. Porque existir um atributo private nunca usado?! Como um atributo que é final e aparentemente sempre vai receber um valor null consegue chamar um método não estatico?!
enfim, é só por curiosidade, se alguém tiver alguma explicação, fala ai…