Arrays 将Foo类型的对象存储到构造中属于Foo的Foo类型的静态数组中,这是一种糟糕的编程实践吗?

Arrays 将Foo类型的对象存储到构造中属于Foo的Foo类型的静态数组中,这是一种糟糕的编程实践吗?,arrays,data-structures,static,Arrays,Data Structures,Static,假设我想将对象静态地存储在它们自己的类中。像这样: public class Foo { private static int instance_id = 0; public static List<Foo> instances = new List<Foo>(); public Foo() { instances[instance_id++] = this; } } 公共类Foo {

假设我想将对象静态地存储在它们自己的类中。像这样:

public class Foo  
{  
    private static int instance_id = 0;  
    public static List<Foo> instances = new List<Foo>();

    public Foo()  
    {  
        instances[instance_id++] = this;  
    }  
}
公共类Foo
{  
私有静态int实例_id=0;
公共静态列表实例=新列表();
公共食物(
{  
实例[instance_id++]=this;
}  
}
为什么?

  • 我不需要在类之外创建唯一的数组结构(一个就可以了)
  • 我想根据每个对象的出生时间将其映射到一个唯一的id
  • 我将只有一个线程使用该类。Foo将仅作为程序中的一个集合存在
我做了搜索,但没有找到这个数据结构的提及。这是坏习惯吗?若然,原因为何?多谢各位


{请注意,此问题并非特定于任何语言}

我可以看到此设置存在一些潜在问题

首先,由于您只有一个对象数组,如果您需要更新代码,以便在不同的上下文中有许多不同的对象组,那么您需要进行重要的重写,以便每个对象最终与不同的上下文相关联。根据您的设置,这可能不是问题,但我怀疑从长远来看,这个决定可能会再次困扰您

其次,这种方法假设您永远不需要处理任何对象。假设您希望更新代码,以便执行许多不同的模拟并聚合结果。如果您这样做,那么您的巨大数组将存储指向您不使用的对象的指针。这意味着您将(1)出现内存泄漏,(2)必须更新所有循环代码以跳过不再关心的对象

第三,这种方法使类而不是客户机负责跟踪所有实例。从某种意义上说,如果你所做的是让客户更容易访问所有存在的对象的全局列表,那么你可能需要考虑把一个不同的列表放在全局可访问的其他地方,这样对象本身就不是负责跟踪自己的人。 我建议使用多种备选方法中的一种:

  • 只需让客户端执行此操作。如果客户端需要跟踪所有实例,只需让它们始终创建所需的数组并填充即可。这样,如果多个客户端需要不同的阵列,它们可以这样做。如果操作正确,还可以避免内存泄漏问题

  • 让每个对象作为其构造函数的一部分,获取要在其中构造的上下文。例如,如果所有这些对象都是四叉树中的节点,则让它们获取指向它们将在其中生存的四叉树的指针作为构造函数参数,然后让四叉树对象存储其中的节点列表。毕竟,四叉树似乎真的有责任跟踪一切

  • > P> <强>继续做你正在做的事情,但是使用弱引用的东西。< /强>例如,你可以考虑在<代码> WeakHashMap < /COD>中使用一些变体,这样你就可以存储所有的东西,但是如果对象不再需要,你至少不会有内存泄漏。


    “不道德?”我不知道那是什么意思。我认为这是个坏习惯。您的静态类本质上是一个全局类,我肯定会在代码评审中标记它。如果你想要一个单身汉,那就用一个。另外,您可能应该将
    实例设置为私有,并提供
    get
    访问器。最后,我强烈怀疑您的问题将以“主要基于意见”结束。谢谢您的输入。回答:*不道德只是我对糟糕编程实践的一种说法。:)*我同意我的类数组访问的全局性是危险的,因为它在线程期间保持打开状态*当我希望将实例化限制为一个对象,但希望生成多个对象时,单例非常有用*如果您对我的数组的访问级别有一个公平的看法,我应该控制和修改类中的对象,如果我想将它们存储在那里的话。下一步应该是使用“get”访问器,我将这样做*我担心这个q的主观性——但是如果列表是
    static
    ,那么
    Foo
    的所有实例都将访问相同的列表。因此,拥有多个类实例没有任何好处。除非除了静态列表之外还有一些实例属性和方法。是的,我将从类外部引用对象,并对它们调用公共非静态方法。我正在做一个游戏,可能会提交一份大学作业,这个特定的类定义了位图矩形。我想更好地封装我的数据,并且我还将这些对象的数据(请注意)存储在一个四叉树中,所以我想限制引用所述对象位置的位置的数量。四叉树存储每个对象矩形的位置,并可以返回引用该对象的对象id。现在,我可以只在四叉树中存储对象,而不使用第二个数组,但我需要在需要时不受限制地访问所有对象。我遵循Java模型-视图-控制器体系结构,我不能让控制器访问我的对象,除非我将它们存储在OpenAccess中。我的对象在图形中以矩形位图的形式存在,但也作为响应播放器和其他AI的非常全局级别的对象。感谢您的输入,我决定取消静态类数组,因为我确实需要手动垃圾收集列表中的对象,因此需要重写所述列表。对我来说,让客户端模块控制散列映射会更容易,这样我就可以精确地剪切出我想要删除的对象