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