Olá Pessoal, tudo bom?
Uma duvida que muitas vezes surge quando somos inexperientes no mundo da linguagem de programação Java é se esta linguagem é puramente orientada a objetos. Como tudo na vida, muitas pessoas irão defender afirmativamente outras pessoas serão contra essa opinião. No artigo de hoje irei descrever um pouco sobre os tipos primitivos. Esse é um argumento fortemente utilizado para ir contra a afirmação de que o Java é puramente orientado a objetos. Esse post não dará a resposta final a isso, apenas irá abordar um dos motivos dessa discussão, existem inúmeros outros. Veja no post abaixo…
Java é puramente orientado a objeto?
Quando estava aprendendo as nuances de programação na época da faculdade muitas pessoas falavam que o Java segue puramente o paradigma orientado a objeto, pois tudo em Java é um objeto, inclusive Strings, (na linguagem de programação C é um array de char) e arrays em si. Apesar disso outras pessoas começavam a contrariar essa opinião afirmando que existe uma coisa básica na linguagem Java que não é objeto os tipos primitivos:
Todos os tipos primitivos (char, boolean, byte, short, int, long, float, double) não são objetos, pois não é possível criar “instâncias” com a palavra reservada new ou chamar operações de objetos utilizando o operador “.” (ponto).
Para solucionar esse “problema” o Java introduziu em sua versão 5 da JDK as classes Wrappers que são espelhos dos tipos primitivos mas agora em Classes. Aham! tá vendo que o Java não é puramente orientado a objeto!!! Falei!
Agora é possível criar instâncias dos wrappers com a palavra reservada new e chamar operações próprias do wrapper. (Toda a explicação sobre o que uma classe Wrapper faz ficará para um próximo post…)
Além disso o Java 5 trouxe o conceito de autoboxing, que é a transformação direta de um tipo primitivo em um wrapper ou o contrário wrapper para tipo primitivo. Apesar de tudo isso, ainda não é possível criar instâncias ou chamar métodos de um tipo primitivo, por exemplo:
1 2 3 4 5 |
Boolean objetoBoolean = new Boolean(true); String string = objetoBoolean.toString(); // sem erros; boolean booleano = 5; string = booleano.toString(); // erro de compilação; |
Logo, fica claro que tipos primitivos não são objetos, mas apenas são utilizados pelo desenvolvedor.
Internamente…
Mas existe uma questão aqui, o que é codificado em uma classe Java não necessariamente é o código Java que será executado pela JVM Assim posso afirmar que todos os tipos primitivos são tratados como objetos! Não acredita, veja o JavaDoc da classe java.lang.Class ((java.lang.Class – API – link))! No primeiro parágrafo do JavaDoc está escrito:
Instances of the class
Class
represent classes and interfaces in a running Java application. An enum is a kind of class and an annotation is a kind of interface. Every array also belongs to a class that is reflected as aClass
object that is shared by all arrays with the same element type and number of dimensions. The primitive Java types (boolean
,byte
,char
,short
,int
,long
,float
, anddouble
), and the keywordvoid
are also represented asClass
objects.
Inclusive da palavra void! Ou seja void também é tratado como uma classe!
Além disso, existe o método isPrimitive() ((Método isPrimitive, classe java.lang.Class – API – link)) dentro da classe java.lang.Class que determina se a tipo atual (this) representa um tipo primitivo.
Ainda não está convencido? Vamos abrir então o JavaDoc de um tipo primitivo, por exemplo, a classe Boolean ((java.lang.Boolean – API – link)) e procure pela palavra TYPE (tudo maiúsculo mesmo). Estará descrito o seguinte texto:
TYPEpublic static final Class<Boolean> TYPEThe Class object representing the primitive type boolean.Since:JDK1.1
Perceba o que está escrito no texto acima, objeto Class que representa o tipo primitivo boolean. E o mais importante está implementado desde a versão 1.1 da JDK. Ou seja, desde os primórdios do Java os tipos primitivos são tratados como objetos, lógico, internamente. Se caso você fizer a seguinte linha de código:
1 |
Boolean.TYPE siteMauda = false; |
Você terá um erro de compilação, indicando que o tipo Boolean.TYPE não é válido, além de um warning no Eclipse indicando para mudar essa linha para boolean.
Bom se internamente a JVM cria objetos para todos os tipos primitivos, porque então utilizá-los? Por não utilizar as classes Wrappers direto? Por causa de um pequeno ponto, os objetos criados internamente pela JVM são extremamente leves e muito mais otimizados que o objeto da sua classe wrapper correspondente, por eles não possuírem métodos próprios e apenas armazenar um único tipo de valor.
Assim podemos afirmar que a JVM trata todos os tipos primitivos como objetos internamente, mas não podemos utilizar esses objetos internos em nossos códigos, para isso existem as classes wrapper.
Java Puro 1 x 0 Java Não Puro 😀
finnaly{
Duvidas ou sugestões? Deixe seu feedback! Isso ajuda a saber a sua opinião sobre os artigos e melhorá-los para o futuro! Isso é muito importante!
Até um próximo post!
Leave a Reply