【笨鸟先飞】Java重新学习日记13--创建一个内部类

在创建一个类的时候 ,我们会创建构造器,变量,方法。 除此之外,我们还可能创建什么?

 

在创建一个类的时候,我们可以创建构造器,变量,方法,我们还可以创建类,所创建出的类,叫做内部类。

 

创建内部类和匿名内部类不一样。在android开发中,匿名内部类的使用几率远远大于内部类。

 

什么情况下,我们考虑创建内部类呢?最常见的是private”情况,即这个内部类仅被创建它的外部类所使用,也就是,我在写一个类,写着写着,需要用一个类来保存或者定义某些东西,而这些东西仅仅是服务于我所写的类,那么这个类很可能就被写成内部类。

 

前文提到过常用的内部类是Thread,以及还有一些类似TimerTask之类的功能型类都考虑使用内部类来实现这功能,匿名内部类在listener等绑定操作以及runnable里面使用很广泛。这些是惯用手法。

 

如果一个类的确特地为另外一个类服务,而且这个类的概率也包含在另一个类里面,那么采用内部类是好的,内部类的极大优势在于,内部类可以轻松调用外部类的一切变量和方法,包括private的方法。

 

大多数时候,我们不建议将其他类来调用一个内部类,一个被外部调用的内部类,我们必须思考,它是否有必要作为内部类?它是否作为普通类更合算。

 

当然,java给我们了调用内部类的方法,外部类为a,内部类为b。则使用a.b.变量 和 a.b.方法 来调用a内部类b的变量和方法。

 

将内部类的惯用方案考虑进去,内部类有三种比较常见的情况。而这3种情况分别有相似的应用场景。

 

情况1:内部类用于实现一些常量。

 

这种情况的典型代表是枚举类。相比于使用多个常量依次命名和赋值,使用枚举类,或者其他内部类,代码可读性会上升,在使用上各有优劣,对于大多数情况,这两种方案没有区别。

 

这里内部类起到对多个相关常量进行命名的作用,将这些常量统一放到内部类里,有着易于管理,易于传递等效果。在作为参数传递时,就可以使用内部类的对象作为参数传递,避免多个常量交替传递,从而降低代码复杂度。

 

情况2:内部类用于实现一种或几种特定的功能

 

这类的代表是Thread类型。也可以是自己在类中定义能够完成某些特殊操作的方法,然后在其他地方通过启用这个类带调用这个功能。

 

这一场景,在使用上和接口有很大的相似之处,都是首先在一处设定好某种规定用法,然后在这个类创建一个内部类来实现这种特殊的功能。

 

自己定义一个新的内部类,在内部类中自定义一种功能,然后在外部类中实现。

 

情况3:内部类用于实现一种有意义的类。

 

这种情况属于一个概率较大的类中,有某个概率较小的类,而这个类需要多个对象,能够储存数据或实现某些方法。

 

譬如一个电脑的大类分为显示器,键盘等等类,而键盘类有分为按钮支架等等,而这个按钮则涉及,是否可拆卸,颜色,大小,上面的字母,点击后有什么效果等等。 我们可以将按钮创建为一个内部类,然后每个按钮实现一个对象,字母数字的按钮形状都一样,而回车,tab等等按钮则有不同的形状。

 

情况3重点考虑的是,有无设置为内部类的必要,或许外部类就可以。面向对象的设计,还是要考虑功能划分和类的大小。

 

之前也说过一个类打天下的错误做法,在类中不停创建内部类来实现较小的类,也属于一个类打天下。回避一个类打天下,就是要保证每个类的权责明确,且尽量避免功能特别复杂的类。

 

以电脑键盘为例,如果按钮涉及的参数不算复杂,可以考虑使用内部类,而如果按钮本身就涉及比较多的功能,那么还是定义为一个普通类。

 

因为内部类是外部类的一部分,内部类的功能,也是属于外部类的。而我们一定要控制外部类的功能范围。以保证外部类的意义明确。

 

这里再展开说一下,什么叫做意义明确。也就是什么叫做控制外部类的功能范围。Java是面向对象的设计,是现阶段最接近人类分工的一门语言。

 

在设计一个类,就像安排一个人做一份工作,内部类就是安排这个人做一点“可做可不做”的工作。

 

比如,一个服务员,我们安排他倒茶,那么他的工作就是倒茶,这个类就叫做倒茶,涉及放茶叶,加水,放茶杯等。 我们也可以给他定一个内部类,收钱,客人喝完茶,付钱,这位服务员收一下钱。这个是合理的,这个内部类工作量不大。

 

如果定个内部类,收钱后,记录一天收多少钱,一个月收多少钱,倒茶的成本是多少。那就不合适,一个服务员,显然不应该做这么多事情。做了这些事情就不是服务员。

 

也就是内部类,还是考虑一个大小的问题。常理而言,内部类一定具备小巧,这个特征,是外部类的小小一部分,不然,还是作为一个普通类,和外部类平起平坐。也就是除了服务员,还要招聘一个财务人员。

 

内部类的一个明显缺点是在调用内部类的时候,需要通过其外部类调用。所以,在其他方面,一个类创建成内部类,不比创建成外部类有优势时,应当优先选择外部类。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值