【问题标题】:best way to model java object with multiple datatypes使用多种数据类型对 java 对象建模的最佳方法
【发布时间】:2011-02-05 01:04:39
【问题描述】:

对具有多种可能数据类型的 java 对象进行建模的最节省内存的方法是什么: 例如

public class Cell{

   short type

   int _int
   double _double
   String _string
}

然后实例化这个对象,并在设置类型时设置适当的值,同时让所有其他对象为空。 (我怀疑这会占用内存,即使是除 String 之外的 null?)

或者,

public class Cell
{

   short type
}
public class StringCell extends Cell
{
   String _string

}

其中每种类型都是某个公共类的子类,只有相应的数据类型。 (我怀疑会有一些与子类相关的内存开销)

【问题讨论】:

  • 在字段设置(或设置为空)后,您打算如何处理这些字段?继承听起来像你想要的。 Cell 在所有类型中都会有一些共同的行为?但是根据单元格的类型,你会有一些特殊的行为吗?
  • 是的,所有单元格和特定单元格的工作都会有共同的东西。
  • 出于好奇,你是在写解释器吗?
  • 不要认为 excel 之类的实现需要存储单元格,单元格如数字、字符串、布尔值、日期值。

标签: java memory object subclass


【解决方案1】:

这对于generics 来说似乎是一个经典问题,因为您说“设置类型设置适当的值,同时将所有其他值保留为空”。

public class Cell<T> {
    T value;
}

那么你可以...

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

如果 Cell 实现了一个好的接口,您甚至可以拥有一个定义良好的异构类型 Cells 集合。

【讨论】:

  • 所以你说的是 public class Cell { private T t; } ?
  • 虽然这可能是一个很好的建模方法,但它不一定是“内存高效”,这是问题的第一句话。将原始 int 存储在 Integer 中效率不高。在 64 位 JVM 中更是如此。
  • 但是我无法控制类中作为泛型传递的内容。有人可能会说 Cell 不仅仅是我想限制的原语
  • 有一些设置可以减少 64 位 JVM 中的指针引用大小。如果除一个之外的所有内容都将为空,那么这仍然比原语占用 N 个字节要小得多。
  • 即使使用 32 位引用,Integer 总是比原始 int 占用更多空间。如果他的单元格主要包含原语,他说他想要限制,那么建议转向包装类不是有效的记忆方式。
【解决方案2】:

你想多了。如果你真的需要这个,那就坚持使用原语,看看Flyweight pattern 是否可以提供帮助。

【讨论】:

  • 是的,享元可以帮助共享字符串,但这只是另一种优化。
【解决方案3】:

如果您需要使用 int、long、float 和 double 原语,最有效的方法是使用原语本身。但是,将它们设置为 null 是不可能的。简单地在课堂上声明它们会占用空间。

使用子类方法可能可行,但这引出了一个问题,基类的价值是什么?我倾向于一个接口,每个原始类型都有不同的实现。这样你就没有继承开销(尽管我怀疑有)并且你只有你需要的原语。

我仍然怀疑你会在那个界面上放什么。可能是某种 Render 方法?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-28
    • 1970-01-01
    • 1970-01-01
    • 2015-06-26
    • 2012-10-11
    • 1970-01-01
    • 2012-11-21
    • 2011-04-05
    相关资源
    最近更新 更多