2011-03-12 14 views
6

Java tiene ambos objetos, Entero y versión primitiva, int, de tipos básicos.Implementación de Java Primitive

Las versiones primitivas son más rápidas/más ligeras/etc. así que, en general, deberías usarlos.

Lo que me pregunto es por qué los diseñadores de Java no solo tienen los tipos de objeto y usan las versiones primitivas como optimizaciones detrás de escena.

Así:

Integer foo(Integer alpha) 
{ 
    Integer total = 0; 
    for(Integer counter = 0; counter < alpha; counter++) 
    { 
     total += counter; 
    } 
    return total; 
} 

serían compilados en código algo como:

int foo(int alpha) 
{ 
    int total = 0; 
    for(int counter = 0; counter < alpha; counter++) 
    { 
     total += counter; 
    } 
    return total; 
} 

En esencia, esta hipotética compilador Java convertiría a instancias de Integer, Double, Float, etc en los tipos primitivos equivalentes . Solo en los casos donde los objetos eran realmente necesarios (digamos para poner el elemento en un contenedor) se involucrarían los objetos enteros reales.

NOTA: el código anterior ha utilizado operadores en objetos enteros que sé que no está permitido. Como estoy inventando hipotéticos compiladores de Java, haré de cuenta que este tiene una carcasa especial para Integer/Float/Double como lo hace para String.

+1

No es un duplicado exacto , pero cubro mucha de esta información en http://stackoverflow.com/questions/5199359/why-do-people-still-use-primitive-types-in-java – corsiKa

+0

@glowcoder, sé todo eso. Pero me pregunto si algo habría impedido que Java hiciera todo esto detrás de escena y no nos preocupara por eso. Es decir, no es necesario que tengamos problemas de rendimiento, ya que parece sencillo para el compilador convertir los usos de Long en long por sí mismo. –

+1

un gran problema es que su ejemplo es simplemente simplista. Estoy muy contento de que Java tenga primitivos; se asignan directamente al hardware y nunca los vi como un obstáculo. Pedir la herramienta de análisis de escape extrema es simplemente pedir demasiado. imagina el entero [], qué tan fácil crees que sería optimizar, escapar analizarlo y generar el mismo código que int [] (beisides que el entero puede ser nulo). Morealso Integer es inmutable y tiene un campo final que evita algunas optimizaciones y requiere aún más análisis. – bestsss

Respuesta

0

Necesita alguna forma de indicarle al compilador que desea la versión encuadrada, ¿no? De lo contrario, ¿cómo sabría si quería la versión que tiene propiedades o la versión original? ¿Qué sucede cuando pasa su Integer a un método que evalúa Integer.MAX_VALUE?

+0

Integer.MAX_VALUE es una constante estática en la clase Integer. No hay necesidad de preocuparse por un objeto Integer real para conseguirlo. Cada vez que tu necesidad real necesitó un objeto entero, lo autoboxearías. –

5

Lo que me pregunto es por qué los diseñadores de Java no solo tenían los tipos de objeto y usaban las versiones primitivas como optimizaciones detrás de escena.

Para comprender las razones detrás de las decisiones de diseño de Java, debe comprender el contexto histórico en el que se realizaron.

La fuerte distinción entre los tipos primitivos y los tipos de referencia se incluyó en el diseño de lenguaje pre JDK 1.0. Antes de JDK 1.5, eso era todo: si quería poner enteros en colecciones (por ejemplo), explícitamente usó Integer.valueOf(int) etc.

Cuando se agregó auto-boxing/auto-unboxing al sistema de tipo en JDK 1.5 , tenía que hacerse de una manera que fuera compatible con versiones anteriores. Lo que se les ocurrió fue un buen compromiso ... pero no lo que habrían/​​podrían haber logrado si hubieran empezado desde cero.

(Y la razón por la que no pudieron/no pudieron "hacer las cosas bien" la primera vez ... a principios de la década de 1990 probablemente tenga que ver con el alcance del idioma original y las presiones de tiempo a las que estaban sometidos obtener el primer lanzamiento. Si han pasado meses/años adicionales tratando de hacerlo bien, es probable que el proyecto se haya eliminado ... o que la ventana de marketing se haya cerrado).

+0

+1 - Porque el contexto es el rey, aunque estoy bastante seguro de que los diseñadores de idiomas habrían sabido cómo hacerlo. Hay lenguajes de objetos puros que preceden a Java después de todo; según mi experiencia, la mayoría de las desviaciones de OO puro se introdujeron para facilitar la vida a las personas procedentes de C. – CurtainDog