java – 大内部类和私有变量
有一件事我经历了几次,是一个服务类(如JBoss服务),由于助手内部类,它已经变得过大了.我还没有找到打破班级的好办法.这些助手通常是线程.这里有一个例子:
/** Asset service keeps track of the metadata about assets that live on other * systems. Complications include the fact the assets have a lifecycle and their * physical representation lives on other systems that have to be polled to find * out if the Asset is still there. */ public class AssetService { //...various private variables //...various methods public AssetService() { Job pollerJob = jobService.schedule( new AssetPoller() ); Job lifeCycleJob = jobService.schedule( AssetLifecycleMonitor() ); } class AssetPoller { public void run() { // contact remote systems and update this service's private variables that // track the assets. } } class AssetLifecycleMonitor { public void run() { // look for assets that have meet criteria for a lifecycle shift // and update this service's private variables as relevant. } } } 所以,如果我有几个帮助者,而且他们都很复杂,那么整体类文件可以变得非常大.我喜欢内部类,因为它清楚了这些类是由服务完全拥有,并且只存在来帮助这个服务.我已经尝试打破类,并将父级服务作为参考传递,这种工作主要是工作,但我不喜欢的是: 所以简而言之,打破这些课程会失去一些我喜欢的封装.但是让他们进入可能会导致一些大的java文件.我还没有找到一个很好的办法来处理这个问题. C有我很少错过的“朋友”的概念,但在这种情况下实际上是有帮助的. 思考? 解决方法
在字节码级内部类只是简单的Java类.由于Java字节码验证器不允许访问私有成员,因此它为您使用的每个专用字段生成合成访问器方法.另外,为了将内部类与其包围的实例进行链接,编译器将合成指针添加到外部的“this”.
考虑到这一点,内部类只是一层语法糖.他们很方便,你列出了一些好点,所以我列出一些你可能想考虑的消极方面: >您的内部类对整个父类具有隐藏的依赖关系,从而使其入站接口模糊.如果您将其解压缩为package-private类,则有机会改进您的设计并使其更易于维护.最初它更冗长,但是经常会发现: >而不是暴露10个访问器,你实际上想要共享一个值对象.通常你会发现你真的不需要引用整个外部类.这也适用于IoC. >您的外部课堂可以绕过任何保护级别,直接访问内部课程的私人成员.这本身并不坏,但它消除了表达您的设计的语言手段之一. 附:我在谈论不平凡的内部类(特别是没有实现任何接口的内部类).三线听众实现是好的. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |