2011-02-04 2 views
2

Что является наиболее памяти эффективным способом для моделирования объекта Java, который будет иметь несколько возможных типов данных: Напримерлучший способ моделирования объекта Java с несколькими типами данных

public class Cell{ 

    short type 

    int _int 
    double _double 
    String _string 
} 

Затем создать экземпляр этого объекта и при установке типа установите соответствующее значение, оставив все остальные равными нулю. (Я подозреваю, что это займет памяти, даже если нуль для строки, кроме?)

Или

public class Cell 
{ 

    short type 
} 
public class StringCell extends Cell 
{ 
    String _string 

} 

Где каждый тип является подклассом некоторого общего класса, который имеет только соответствующий тип данных. (я подозреваю, что будет какая-то память над головой, связанная с подклассами)

+0

Что вы планируете делать с полями после того, как они были установлены (или установлены в null)? Наследование звучит так, как вы хотите. У ячейки будет некоторое общее поведение по всем типам? Но тогда у вас будет какое-то особое поведение в зависимости от типа ячейки? – DaveJohnston

+0

Да, будут общие вещи для всех ячеек, а также для работы с ячейками. –

+0

Из любопытства вы пишете переводчика? – finnw

ответ

2

Это выглядит как классическая проблема для generics, так как вы говорите: «Установка типа устанавливает соответствующее значение, оставив все остальные равными нулю».

public class Cell<T> { 
    T value; 
} 

Тогда вы можете иметь ...

Cell<String> stringCell = ... 
Cell<Integer> integerCell = ... 

Если Cell реализован удобный интерфейс вы могли бы даже иметь четко определенную совокупность разнородных типизированных клеток.

+0

Итак, вы говорите, что общественный класс Cell { частный T t; } ? –

+0

Хотя это, вероятно, хороший способ моделировать это, он не обязательно «эффективен с точки зрения памяти», что было самым первым предложением вопроса. Хранение примитива int в Integer неэффективно. Тем более в 64-битной JVM. – rfeak

+0

Но тогда я не могу контролировать то, что передается в классе как общий. Кто-то может сказать Cell не только примитивы, которые я хочу ограничить –

0

Вы уже об этом думаете. Если вам действительно нужно это, то придерживайтесь примитивов, а также посмотрите, может ли помочь Flyweight pattern.

+0

Да, Flyweight может помочь для общих строк, но это просто еще одна оптимизация. –

0

Если вам нужно работать с int, long, float и double primitives, наиболее эффективным способом является использование самого примитива. Однако установить их в null невозможно. Просто объявление их в классе займет место.

Работа с подклассовым подходом может работать, но это задает вопрос, каково значение базового класса? Я склоняюсь к интерфейсу с различными реализациями на примитивный тип. Таким образом, у вас нет накладных расходов (хотя я сомневаюсь, что они есть) И у вас есть только примитив, который вам нужен.

Я все еще сомневаюсь в том, что вы наделите этим интерфейсом. Возможно, какой-то метод рендеринга?

Смежные вопросы