有一件事我经历了几次,是一个服务类(如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.
    }
  }
}

所以,如果我有几个帮助者,而且他们都很复杂,那么整体类文件可以变得非常大.我喜欢内部类,因为它清楚了这些类是由服务完全拥有,并且只存在来帮助这个服务.我已经尝试打破类,并将父级服务作为参考传递,这种工作主要是工作,但我不喜欢的是:
>我最终暴露了包级别的访问器,所以分解的类可以获得变量,而在我没有暴露setter之前,因为内部类有直接访问.
>另外,事情有点更加冗长,因为我不断调用访问器而不是基础变量.一个小小的,被授予.
>便利方法(例如checkAssetIsValid()或某些)需要打包级别的暴露,所以帮助类可以调用它们,如前所述,内部类可以是私有的.
>更糟糕的是,我需要将服务实现类传递给辅助类构造函数,因为我不想在服务实现的接口中公开这些helpers方法,因为这迫使它们被公开.这可能会产生一些单元测试/嘲笑问题.
更糟糕的是,我想做的任何同步通过一些外部的便利方法泄露出来(例如在轮询器更新期间的lockDownAssets()).之前,内部类可以访问私钥.

所以简而言之,打破这些课程会失去一些我喜欢的封装.但是让他们进入可能会导致一些大的java文件.我还没有找到一个很好的办法来处理这个问题. C有我很少错过的“朋友”的概念,但在这种情况下实际上是有帮助的.

思考?

解决方法

在字节码级内部类只是简单的java类.由于Java字节码验证器不允许访问私有成员,因此它为您使用的每个专用字段生成合成访问器方法.另外,为了将内部类与其包围的实例进行链接,编译器将合成指针添加到外部的“this”.

考虑到这一点,内部类只是一层语法糖.他们很方便,你列出了一些好点,所以我列出一些你可能想考虑的消极方面:

>您的内部类对整个父类具有隐藏的依赖关系,从而使其入站接口模糊.如果您将其解压缩为package-private类,则有机会改进您的设计并使其更易于维护.最初它更冗长,但是经常会发现:

>而不是暴露10个访问器,你实际上想要共享一个值对象.通常你会发现你真的不需要引用整个外部类.这也适用于IoC.
>而不是提供显式锁定的方法,将操作与其上下文封装在单独的类(或将其移动到两个类之一 – outer或formerly-inner)中更为可维护.
>便利方法属于包私有实用程序类.您可以使用Java5静态导入使其显示为本地.

>您的外部课堂可以绕过任何保护级别,直接访问内部课程的私人成员.这本身并不坏,但它消除了表达您的设计的语言手段之一.
>因为你的内部类被嵌入到一个外部类中,所以重用它的唯一方法是对外部类进行子类化.另一种方法是将显式引用传递给外部类实现的包私有接口.这将允许你嘲笑外部,并更好地测试内部类.
>虽然最近的调试器很好,我在调试内部类之前遇到过问题(有条件的断点范围混乱,不能在断点处停止等等)
私人课程会膨胀你的字节码.看到我的第一个段落 – 通常有一个API可以使用和减少合成的数量.

附:我在谈论不平凡的内部类(特别是没有实现任何接口的内部类).三线听众实现是好的.

java – 大内部类和私有变量的更多相关文章

  1. ios – Xamarin Ahead-of-Time(AOT)编译器与普通编译器

    我的理解是Xamarin的Ahead-of-Time编译器直接将Xamarin.iOS应用程序编译为本机ARM汇编代码.然而,我没有得到的是为什么它需要被称为“Ahead-of-Time”而不仅仅是一个普通的编译器.Xamarin的AOT编译器和传统编译器之间有什么区别,还是仅仅是一个营销术语?没有.Xamarin在该段中传达的信息是,他们的代码比简单的基于字节码的语言执行得更快.对于iOS和Android,他们都能够在热代码路径上执行本机代码以提高性能.AOT和JIT这两个术语是关于他们如何做到这一点的

  2. 使用swift编译器裸机?

    我真的很想使用swift进行嵌入式编程,因为我觉得它更适合用于c,我正在使用的处理器是ARMCortex-M4F(http://www.ti.com/tool/ek-tm4c123gxl).看一下swift编译器page,它说你可以从swift源生成LLVMIR然后我希望与LLVM交叉编译.这可能吗?绝对可以使用Swift生成机器代码.实际上,默认情况下,当您在Xcode或swiftc命令行编译器

  3. 什么是我可以使用Kotlin的最早的Android API级别?

    我认为这个问题很清楚但是我能在Kotlin上定位的最早API级别是什么?解决方法实际上,任何API级别.这是因为Kotlin被编译为JVM6平台的字节码,所有AndroidAPI级别都支持该字节码.因此,除非您在Kotlin代码中使用任何较新的AndroidAPI,否则它不需要任何特定的API级别.

  4. Kotlin与Android上的ART 100%兼容吗?

    ART是Android上的“新”Dalvik运行时版,自Android5.0起就取代了它.我非常热衷于Kotlin&在JVMv8上运行的JavaFX.我不确定Kotlin编译器生成或将在其达到v1.0发布状态时生成的字节码版本.所以问题是:ART现在能够运行“Kotlin代码”并且能够在未来运行Kotlin代码,例如什么时候Kotlin编译器要发出Java8字节码?解决方法与Android的兼容性是我们的首要任务,因此请确保Kotlin在发布时支持ART.目前Kotlin生成字节码版本1.6,因此它是兼容

  5. 详解Java中的字节码增强技术

    字节码增强技术就是一类对现有字节码进行修改或者动态生成全新字节码文件的技术。本文将通过示例详细说说Java的字节码增强技术,需要的可以参考一下

  6. 使用Android studio查看Kotlin的字节码教程

    这篇文章主要介绍了使用Android studio查看Kotlin的字节码教程,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

  7. 详解JVM基础之字节码的增强技术

    字节码增强技术就是一类对现有字节码进行修改或者动态生成全新字节码文件的技术。接下来,我们将从最直接操纵字节码的实现方式开始深入进行剖析,感兴趣的可以了解一下

  8. Python字节码与程序执行过程详解

    这篇文章主要为大家介绍了Python字节码与程序执行过程详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  9. java Class文件结构解析常量池字节码

    这篇文章主要为大家介绍了java Class文件的整体结构解析常量池字节码详细讲解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. Android逆向入门之常见Davlik字节码解析

    Dalvik是Google公司自己设计用于Android平台的虚拟机。Dalvik虚拟机是Google等厂商合作开发的Android移动设备平台的核心组成部分之一,本篇文章我们来详细解释常见Davlik字节码

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部