2012-02-06 80 views
2

在Java中如何遍历特定类的每个对象,还是必须跟踪每个对象,因为我使用引用数组构造/销毁并访问对象数据?你可以遍历Java中特定类的每个对象吗?

+0

你正在制作你自己的'Collection'吗? – Paul 2012-02-06 01:21:37

+1

为什么你想知道这个?这是一个不寻常的事情想知道,所以回答这将帮助我们回答你的问题。这听起来像你的问题是关于某种方式*做些事情,所以如果你告诉我们你实际上是什么*试图做(用简单的英语),也许我们可以提供一些更优雅的解决方案。 – Bohemian 2012-02-06 01:27:39

+0

@Bohemian我只学了四天Java,所以对我来说很简单!我正在为显示在屏幕上的元素创建一个名为'Element'的类。它们将被动态地创建,所以这个类所创建的对象的数量不会被预定义。其他几个类将扩展这个并添加一些方法。我在想的是,每当需要重新打印窗口时,都可以依次查看每个元素对象,只有当可见属性设置为“true”时,才会在屏幕上绘制该对象。 – 2012-02-06 01:38:47

回答

0

如果没有对象的引用,它们将成为垃圾回收的候选对象。所以,是的,你必须以某种方式跟踪它们。你可以但不必为此使用数组;还有Java的collections

2

在Java中,我会用aspects和切入点上一个新的对象initialization(构造函数)

此仪器不会与应用程序的正常运行干扰,你也可以打开或关闭该功能,你想要它。

大多数当前的java工具都支持方面。

1

获得特定任意类的所有对象列表而不修改任何现有代码的唯一方法是探索Java垃圾收集器的奇妙世界。

我不认为你想这样做,虽然它在理论上是可能的。更简单的方法是让父级构造函数在创建时跟踪每个实例,并使用一些静态处理程序注册它。

但最好的方法可能是使用工厂模式,其中“工厂”类负责相关类的制造和跟踪实例。

编辑:请注意,您不想在这样的类中持有对该对象的强引用,否则会阻止任何对象的内存被释放。 A WeakReference将是必要的。

+0

之前从来没有听说过。可能是因为我从不需要它。很高兴知道。 – UmNyobe 2012-02-06 01:46:28

1

我不认为有办法。问题是:什么时候在java中释放一个对象?虚拟机使用类似于引用计数器的东西,当它变为0时,对象不再可用。所以虚拟机本身不能提供这样的功能,因为它至少需要一个对象的引用,或者从不进行垃圾收集。当你自己创建对象时,始终跟踪一个简单的集合是相当容易的。

+0

我相信垃圾收集器保存的引用类型称为* weak reference *;这使得垃圾收集器本身可以获取对象而不会阻止它们被收集。 – Borealid 2012-02-06 01:35:52

+0

是的你是对的,但我只谈论允许用户代码访问对象的引用。 – UmNyobe 2012-02-06 01:41:06

0

有一些库可以让您导航对象图。看看公地OGNL这里:http://commons.apache.org/ognl/从开发者指南

报价在这里找到:http://commons.apache.org/ognl/developer-guide.html

“OGNL作为一种语言可以为Java的导航通过一个简洁的语法,允许你指定,其中可能的对象,对称可设置和可获得的值语言指定了一种语法,试图提供尽可能高的抽象级别来导航对象图;这通常意味着指定通过和到达JavaBeans属性,集合索引等的路径,而不是直接访问属性获得者和制定者(统称为访问者)。“

自从我使用它以来已经有一段时间了,但当时它是不可或缺的。

+0

OGNL不会任意访问其执行上下文之外的对象。 OP正在问一个不同的问题。 – 2012-02-06 01:22:41

+0

这是真的,它可能无助于上下文明智(我喜欢这方面的答案,并已投票表决。) – Jubal 2012-02-06 01:30:35

0

你可以做到这一点的唯一方法就是在你想要关注的类内部保留一个静态列表,然后在构造函数中将每个对象添加到该列表中。

您必须知道,即使您不再使用它们,垃圾收集器也不会收集任何这些对象。

0

根据这SO question它似乎并不真的有可能在Java中有效地做到这一点。这里讨论了一些相当繁重的方法,但它们略微超出了我的意思,但这个问题中的海报似乎要求类似于您所描述的内容,最后在其编辑中得出结论,它似乎并不是容易完成。

1

您可以通过将每个新实例存储在静态WeakHashSet中来跟踪一个类的所有实例(也可能是一些额外的)。但我不得不同意你的设计听起来很可疑。从更详细的描述来看,这听起来像窗口需要一组元素(如果它还没有),它应该可以在屏幕上绘制它们。