建议38: 使用静态内部类提高封装性

Java中的嵌套类(Nested Class)分为两种:静态内部类(也叫静态嵌套类,Static Nested Class)和内部类(Inner Class)。内部类我们介绍过很多了,现在来看看静态内部类。什么是静态内部类呢?是内部类,并且是静态(static修饰)的即为静态内部类。只有在是静态内部类的情况下才能把static修复符放在类前,其他任何时候static都是不能修饰类的。

静态内部类的形式很好理解,但是为什么需要静态内部类呢?那是因为静态内部类有两个优点:加强了类的封装性和提高了代码的可读性,我们通过一段代码来解释这两个优点,如下所示:

 1 public class Person {
 2     // 姓名
 3     private String name;
 4     // 家庭
 5     private Home home;
 6
 7     public String getName() {
 8         return name;
 9     }
10
11     public void setName(String name) {
12         this.name = name;
13     }
14
15     public Home getHome() {
16         return home;
17     }
18
19     public void setHome(Home home) {
20         this.home = home;
21     }
22
23     // 构造函数设置属性值
24     public Person(String _name) {
25         name = _name;
26     }
27
28
29     public static class Home {
30         public String getAddress() {
31             return address;
32         }
33
34         public void setAddress(String address) {
35             this.address = address;
36         }
37
38         public String getTel() {
39             return tel;
40         }
41
42         public void setTel(String tel) {
43             this.tel = tel;
44         }
45
46         // 家庭地址
47         private String address;
48         // 家庭电话
49         private String tel;
50
51         public Home(String _address, String _tel) {
52             address = _address;
53             tel = _tel;
54         }
55     }
56 }

其中,Person类中定义了一个静态内部类Home,它表示的意思是“人的家庭信息”,由于Home类封装了家庭信息,不用在Person类中再定义homeAddre、homeTel等属性,这就使封装性提高了。同时我们仅仅通过代码就可以分析出Person和Home之间的强关联关系,也就是说语义增强了,可读性提高了。所以在使用时就会非常清楚它要表达的含义:

1 public class Client {
2     public static void main(String[] args) {
3          //定义张三这个人
4          Person p = new Person("张三");
5          //设置张三的家庭信息
6          p.setHome(new Person.Home("上海","021"));
7     }
8 }

定义张三这个人,然后通过Person.Home类设置张三的家庭信息,这是不是就和我们真实世界的情形相同了?先登记人的主要信息,然后登记人员的分类信息。可能你又要问了,这和我们一般定义的类有什么区别呢?又有什么吸引人的地方呢?如下所示:

提高封装性。从代码位置上来讲,静态内部类放置在外部类内,其代码层意义就是:静态内部类是外部类的子行为或子属性,两者直接保持着一定的关系,比如在我们的例子中,看到Home类就知道它是Person的Home信息。

提高代码的可读性。相关联的代码放在一起,可读性当然提高了。

形似内部,神似外部。静态内部类虽然存在于外部类内,而且编译后的类文件名也包含外部类(格式是:外部类+$+内部类),但是它可以脱离外部类存在,也就是说我们仍然可以通过new Home()声明一个Home对象,只是需要导入“Person.Home”而已。

解释了这么多,读者可能会觉得外部类和静态内部类之间是组合关系(Composition)了,这是错误的,外部类和静态内部类之间有强关联关系,这仅仅表现在“字面”上,而深层次的抽象意义则依赖于类的设计。

那静态内部类与普通内部类有什么区别呢?问得好,区别如下:

(1)静态内部类不持有外部类的引用

在普通内部类中,我们可以直接访问外部类的属性、方法,即使是private类型也可以访问,这是因为内部类持有一个外部类的引用,可以自由访问。而静态内部类,则只可以访问外部类的静态方法和静态属性(如果是private权限也能访问,这是由其代码位置所决定的),其他则不能访问。

(2)静态内部类不依赖外部类

普通内部类与外部类之间是相互依赖的关系,内部类实例不能脱离外部类实例,也就是说它们会同生同死,一起声明,一起被垃圾回收器回收。而静态内部类是可以独立存在的,即使外部类消亡了,静态内部类还是可以存在的。

(3)普通内部类不能声明static的方法和变量

普通内部类不能声明static的方法和变量,注意这里说的是变量,常量(也就是final static修饰的属性)还是可以的,而静态内部类形似外部类,没有任何限制。

转载于:https://www.cnblogs.com/DreamDrive/p/5428729.html

[改善Java代码]使用静态内部类提高封装性相关推荐

  1. java 代码解析工具_改善 Java 代码质量的工具与方法

    原标题:改善 Java 代码质量的工具与方法 我们可能见过上面的有关代码质量的图片,究竟如何衡量一段代码好坏? 代码质量是什么?为什么它很重要? 作家通过他的著作来讲述了一个清晰的.令人信服的故事.他 ...

  2. 改善Java代码有哪些方法?

    前言 Java是一门优秀的面向对象的编程语言,针对遇到同样的一个问题会有很多中解法哪种实现方法是最好的呢,还需要不断的探究JDK的底层原理.我会例出Java改善的建议哦,希望大家可以在平时开发工作去使 ...

  3. jsp里加java代码,利用静态内部类为您的代码添加辅助功能-JSP教程,Java技巧及代码...

    利用静态内部类为您的代码添加辅助功能 作者 john d. mitchell 摘要这个技巧提供了一个实例,它可以利用静态内部类为您的类添加独立的.可选的辅助功能,例如测试和示例代码等.( 500 字) ...

  4. Java——OOP三大特性之封装性(Encapsulation)通俗详细

    面向对象(Object Oriented Programming)三大特性 1.封装(Encapsulation) 2.继承(Inheritance) 3.多态(Polymorphism) 定义 En ...

  5. java 代码效率_提高代码性能效率总结(一)--Java

    Java代码实现一些具体功能时常常有很多方法,不过有些方法的使用可以使代码的性能更好,效率更高,所以决定总结一些使用技巧,方便自己巩固,也方便初学者进行提高. 1.使用&&和||比&a ...

  6. [改善Java代码]养成良好习惯,显式声明UID

    建议11: 养成良好习惯,显式声明UID 我们编写一个实现了Serializable接口(序列化标志接口)的类, Eclipse马上就会给一个黄色警告:需要增加一个Serial Version ID. ...

  7. [改善Java代码]在接口中不要存在实现代码

    第3章  类.对象及方法 书读得多而不思考,你会觉得自己知道的很多. 书读得多而思考,你会觉得自己不懂的越来越多. -伏尔泰 在面向对象编程(Object-Oriented Programming,O ...

  8. java 不可修改的集合对象_[改善Java代码]asList方法产生的List对象不可更改

    上一个建议之处了asList方法在转换基本类型数组时候存在的问题,在看下asList方法返回的列表有何特殊的地方.看代码: importjava.util.Arrays;importjava.util ...

  9. [改善Java代码]减少HashMap中元素的数量

    在系统开发中我们经常会使用HashMap作为数据集容器,或者是用缓冲池来处理,一般很稳定,但偶尔也会出现内存溢出的问题(OutOfMemory错误),而且这经常是与HashMap有关的.而且这经常是与 ...

  10. [改善Java代码]线程优先级只使用三个等级

    线程的优先级(priority)决定了线程获得CPU运行的机会,优先级越高获得的运行机会越大,优先级越低获得的机会越小.Java的线程有10个级别(准确的说是11个级别,级别为0的线程是JVM,应用程 ...

最新文章

  1. 《C#高级编程》既不高级,也不基础,东拼西凑的味道十足。。。
  2. 在NamedParameterJdbcTemplate中使用like查询
  3. RuntimeError 之 : CUDA error: device-side assert triggered
  4. GetRegisterAsBrowser CHtmlView::GetRegisterAsBrowser
  5. CSE lab7 RPC 攻略
  6. 一晚卖2500多万,制服到底有多大诱惑?
  7. 【hadoop】Apach Hdoop 安全模式
  8. 对长度为200的有序表进行二分查找_程序员常用的查找算法(顺序、二分、插值、分块、斐波那契)...
  9. Android定时器AlarmManager(定时发送广播)
  10. eShopOnContainers学习系列(二):数据库连接健康检查
  11. php round函数
  12. 使用@PostConstruct创建需要依赖注入的工具类
  13. PSPICE仿真数据转MATLAB
  14. 非负数正则表达式 js jquery demo
  15. mysql实现经纬度查询并按距离排序
  16. python玩扫雷_python实现扫雷小游戏
  17. Java实现 蓝桥杯VIP 算法提高 文化之旅
  18. 数据分析36计(22):分析师入门常见错误 幸存者偏差,如何用匹配和加权法规避...
  19. bistu新生-1005
  20. 考研计算机需要学复变函数与积分变换,《复变函数与积分变换》期末考研重点复习试题...

热门文章

  1. 将不确定变成确定~Uri文本文件不用浏览器自动打开,而是下载到本地
  2. Zookeeper使用案例
  3. 不可不知的socket和TCP连接过程
  4. django实现目录上传(最简单的方法)
  5. iptables快速记忆总结
  6. 2012-08-20 → 2012-08-26 周总结
  7. [Android]OkHttp的简单封装-辅助框架
  8. [WebApi] 捣鼓一个资源管理器--文件下载
  9. Luogu3792 由乃与大母神原型和偶像崇拜
  10. SQL Server完整性备份说明