2012-06-22 16 views
5

Usando el ejemplo común de un objeto Point (x, y), ¿hay alguna manera de tenerlo como una estructura en Java 1.4? La ventaja sería que no habría una asignación de memoria separada para el objeto Point porque la estructura sería parte del objeto contenedor. Pero aún tendría funciones miembro para acceder a él.¿Hay alguna manera de tener el equivalente de una estructura en Java 1.4?

estoy 98% seguro de que la respuesta es no, pero la esperanza es eterna ...

qué/por qué: En nuestro código tenemos 100.000 objetos (alrededor de 12 - 14% de la huella total de la memoria) eso es un int y un booleano. Si eso fuera una estructura C# dentro del objeto, reduciría la cantidad de objetos. Y ... estamos buscando que sea solo un int donde 0x40000000 es el valor booleano. Pero manejar eso es mucho más fácil si tenemos métodos de miembro para ese int y se trata como una estructura.

+0

Parece preocupado por la asignación de memoria ... ¿Quiere decir usar "nuevo"? –

+1

¿Puede proporcionar algún código de muestra que describa exactamente qué es una "estructura" de Java? –

+0

¿Quiere decir equivalente a una estructura C#? ¿Un tipo de valor, sin referencias, no puede ser nulo, no golpea al recolector de elementos no utilizados? –

Respuesta

1

No, tiene que usar Object s para "estructuras" generales.

Sin embargo, para estructuras de datos simples como pares de int s, puede utilizar un poco de engaño para ahorrar memoria y aumentar la velocidad.

int a = 9; 
int b = 10; 
long pair = (a << 32)|b; 

Esta paquetes de los 32 bits de a y b en un long. He aquí cómo se extrae de ellos:

a = (int)(pair >> 32); 
b = (int)pair; 
1

Una adición a tskuzzy's answer: otra posibilidad sería levantar las int x y int y campos de la clase Point en las clases que necesitan almacenar los valores de punto.

Editar en respuesta a los comentarios:

Una cosa que podría hacer es que cada clase que necesita para almacenar un valor único punto extender una clase Point. No habría ninguna relación lógica, pero le da acceso a los objetos Point a través de una única interfaz. Sin embargo, esto no funcionaría (no creo) para ninguna clase que necesite almacenar valores de puntos múltiples.

+0

Eso es lo que estamos buscando hacer. Pero tenemos un montón de estos en una clase y para que todo se vuelva desordenado. Odio perder la limpieza de una interfaz de objeto. Oh, bueno, la vida es imperfecta. –

+0

Aún puede escribir un objeto que tiene una interfaz agradable, pero utiliza la implementación más eficiente de la memoria. –

2

No hay una estructura equivalente en Java ahora, aunque creo que se han insinuado para versiones futuras. Todavía eche un vistazo al patrón flyweight, podría ser lo que está buscando http://en.wikipedia.org/wiki/Flyweight_pattern

+0

Desafortunadamente, todos estos tienen diferentes valores. O para ser más precisos, cada uno puede establecerse en un valor diferente en cualquier momento. –

+0

Bueno, el patrón dice que los objetos son inmutables pero que puede cambiar la referencia al objeto obteniendo uno nuevo del grupo, ¿son diferentes la mayoría de sus 100k + objetos?, ¿no se puede refactorizar en partes que se puedan agrupar por separado? – ilcavero

+0

Probablemente sería un grupo de un par de cientos. Pero eso mueve el problema porque cada conjunto se convierte en una búsqueda y asignación de mapa. Creo que sería peor que almacenar las primitivas directamente y tener métodos estáticos para operarlas. Me lleva de vuelta a los viejos tiempos de C donde el código que escribí era, en retrospectiva, tan orientado a objetos como podías obtener con solo estructuras. –

Cuestiones relacionadas