如何创建同一实例的多个对象

时间:2014-10-30 18:32:53

标签: java

基本上,我想要做的是从同一个实例创建许多对象。 我并不是要创建一个像这样的新实例:

Object obj = new Object();

我的意思是从这个实例中获得多个对象。

举个例子:

//Long way that causes more lag
Object obj = new Object();
Object obj2 = new Object();
Object obj3 = new Object();

//causes less lag
Object[] = <all the instances of obj>

long way
#####
##### //# = block | each # has its own instance

short way
#####
##### //# = block | each # is controlled by ONE instance

我无法想到任何这方面的例子,但我认为Minecraft会将这个用于所有块。

我想知道如何做到这一点的原因是因为我认为它会减少延迟。

如果有办法/不是办法,请告诉我。

3 个答案:

答案 0 :(得分:2)

我认为您正在寻找Flyweight pattern。这种技术允许在许多类似对象之间共享对象数据,从而大大降低了内存需求。我对Minecraft的内部结构并不熟悉,但我强烈怀疑他们使用这个(或类似的东西)作为他们的块。它通常在以下时间使用:

  • 使用了许多类似的对象,存储成本很高
  • 每个对象的大部分状态数据都可以是外在的
  • 一些共享对象很容易替换许多非共享对象
  • 每个对象的身份无关紧要

除了上面链接的维基百科文章外,请查看有关该主题的this article

答案 1 :(得分:0)

对象和对象实例的含义相同。如果你想创建多个对象或多个实例,同样的事情,你需要调用new作为数组分配,例如。

Object[] obj = new Object[size];

答案 2 :(得分:0)

您不能拥有“同一实例的不同对象”,因为对象和实例是相同的。像“人类”和“人”一样,或多或少。

但是,您可以将多个引用添加到同一实例,这可能有助于在适当的情况下保持内存占用和创建/复制时间。请注意,在Java中,使用对象类型定义的变量,例如:

String str;

实际上并没有持有物体。它持有对象的引用。所以你可以有类似的东西:

String originalString = "This in a string".

String a = originalString;
String b = originalString;
String[] arr = new String[10];
for ( int i = 0; i < arr.length; i++ ) {
    arr[i] = originalString;
}

在这种情况下,您将只有一个对象。此代码示例中的每个变量 - originalStringab以及arr的所有元素 - 都是对同一对象/实例的引用。

The result is this