2012-06-22 7 views
5

Utilizzando l'esempio comune di un oggetto Point (x, y), esiste un modo per averlo come struct in Java 1.4? Il vantaggio sarebbe che non ci sarebbe un'allocazione di memoria separata per l'oggetto Point perché la struttura sarebbe parte dell'oggetto contenente. Ma avrebbe ancora le funzioni membro per accedervi.C'è un modo per avere l'equivalente di una struct in Java 1.4?

Sono certo che il 98% la risposta è no, ma la speranza è eterno ...

Cosa/Perché: Nel nostro codice abbiamo 100.000 oggetti (circa 12 - 14% della occupazione di memoria totale) questo è un int e un booleano. Se fosse una struttura C# all'interno dell'oggetto, ridurrebbe il numero di oggetti. E ... stiamo cercando di renderlo solo un int dove 0x40000000 è il valore booleano. Ma gestirlo è molto più semplice se abbiamo i metodi member per quell'int e viene trattato come una struct.

+0

Sembri preoccupato per l'allocazione di memoria ... Intendi usare "nuovo"? –

+1

Puoi fornire qualche codice di esempio che descriva cosa sia esattamente una "struct" di Java? –

+0

Intendi equivalente a una struttura C#? Un tipo di valore, nessun riferimento, non può essere nullo, non colpisce il garbage collector? –

risposta

1

No, è necessario utilizzare Object s per le "strutture" generali.

Tuttavia, per strutture di dati semplici come coppie di int s, è possibile utilizzare un po 'di trucchetti per risparmiare memoria e aumentare la velocità.

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

Questa confezioni i 32 bit di a e b in un long. Ecco come li si estrae:

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

Un'aggiunta al tskuzzy's answer: un'altra possibilità sarebbe quella di sollevare le int x e int y campi della classe Point in tutte le classi che hanno bisogno di memorizzare i valori del punto.

Modifica in risposta ai commenti:

Una cosa che potreste fare è di avere ogni classe che ha bisogno di memorizzare un valore unico punto estendere una classe Point. Non ci sarebbe logica: una relazione, ma ti dà accesso agli oggetti Point attraverso una singola interfaccia. Questo non funzionerebbe (non credo) per tutte le classi che hanno bisogno di memorizzare più valori punto, però.

+0

Questo è quello che stiamo cercando di fare. Ma abbiamo un sacco di questi in una classe e così tutto diventa disordinato. Odio perdere la pulizia di un'interfaccia oggetto. Oh bene, la vita è imperfetta. –

+0

È ancora possibile scrivere un oggetto con un'interfaccia piacevole, ma utilizza un'implementazione più efficiente in termini di memoria. –

2

Non c'è nessuna struttura equivalente su Java ora, anche se credo che siano stati suggeriti per le versioni future. Dai un'occhiata al modello del peso mosca, potrebbe essere quello che stai cercando http://en.wikipedia.org/wiki/Flyweight_pattern

+0

Purtroppo questi hanno tutti valori diversi. O per essere più precisi, ognuno può essere impostato su un valore diverso in qualsiasi momento. –

+0

bene il modello dice che gli oggetti sono immutabili ma che puoi cambiare il riferimento all'oggetto ottenendo uno nuovo dal pool, la maggior parte dei tuoi 100k + oggetti è diversa?, non puoi refactory in parti che sono pool-capaci separatamente? – ilcavero

+0

Probabilmente sarebbe un pool di un paio di centinaia. Ma questo sposta il problema perché ogni insieme diventa quindi una ricerca e un compito sulla mappa. Penso che sarebbe peggio che immagazzinare i primitivi direttamente e avere metodi statici per operare su di essi. Mi riporta ai vecchi tempi di C, in cui il codice che ho scritto era, a ben vedere, un oggetto orientato agli oggetti che si poteva ottenere solo con le strutture. –

Problemi correlati