2009-10-01 40 views
2

我有一个大型的树状数据结构的对象行为大多相同,但在一个或两个方法计算一些用于导航结构的关键方法不同。发散行为取决于物体在结构中的位置。Java中匿名类和预定义类之间有什么相关的区别?

我刚从一个抽象基类开始,有几个子类来实现每种类型的行为。这给了我十个左右的子类型,这些子类型是:a)难以明智地命名,b)在我的项目源文件夹中看起来有点笨拙,因为它们非常相似。

我希望有一个工厂类可以在运行中释放匿名子类的实例。这会给我很大的灵活性,并为大量改进打开大门,例如共享数据和参数化内容,并且在我的代码结构中看起来更清晰。但是,整个事情对内存占用和内存访问时间非常敏感,而且我会有很多这样的对象。我是否必须考虑匿名课程的缺点或特点?

+0

不,它没有区别 – skaffman 2009-10-01 14:58:57

+0

匿名类不是静态的。 “父”类不能独立垃圾收集。 – 2009-10-01 15:12:06

回答

4

像非静态内部类,匿名类有一个隐藏的参考他们在定义的类,如果你使用的序列化,当然还有防止外部类对象的资格被GC可能导致问题 - 但如果你在一个工厂班上做这件事,这不太可能是个问题。

+0

他也可以使用静态内部类。这将解决参考问题以及OP提到的“组织”问题。尽管如此,他仍然必须命名他们(或不)。 – Kevin 2009-10-01 15:12:40

+0

+1好点,隐藏参考 – KLE 2009-10-01 15:13:20

1

一个类是一个类。无论它是“顶级”类,常规内部类,本地内部类还是匿名内部类都无关紧要。

非静态内部类或访问其封闭类的私有成员的内部类将在其中有一小部分额外的代码。对于非静态内部类,编译器添加一个引用封闭实例的成员变量。如果内部类访问封闭类的任何私有成员,编译器将在封装类中使用“包 - 私有”(默认)可访问性合成访问器。

+0

但你忘记提及任何内存占用的影响(如果有) – Chii 2009-10-01 15:11:41

3

匿名类与命名类没有区别。

但是,有很多对象会影响你的内存占用和性能(垃圾收集)。


从你告诉什么,我不知道是否有可能在两个部分分裂类:

  1. 全部在一个类中的常量方法(没有这个类的子类)。
  2. 所有变量方法(见后面)都封装在Position接口中。你可以有几个类来实现它。这些类的对象将没有状态,因此它们可以是对性能和内存非常好的共享实例)。

变量方法:根据结构中的位置计算一些键。

+0

感谢您的建议! – 2009-10-05 07:43:06

+0

@Hanno感谢您的亲切反馈。我投票支持你;-) – KLE 2009-10-05 07:57:20

2

如前所述,匿名内部类通常具有对其声明类的隐藏引用。但是,您可以通过在静态方法中声明匿名类来消除这种情况(简单,并非完全明显)。

这种技术的主要缺点是在jar中看到的类名将被编号(如“MyClass $ 0”。类“),并且不容易在栈跟踪中识别(当然除了使用行号除外),并且不在您自己的println语句中不容易识别的toString()方法

声明静态内部类是一种很棒的技术,它会消除所有这些缺点,并保持你的文件层次结构紧凑,也可以考虑使这些内部类为私有或最终的,除非你需要扩展它们

相关问题