类和接口

类和接口是java程序设计语言的核心。java语言提供了许多强大的基本元素,供程序员用来设计类和接口。本文阐述一些指导原则,可以帮助你更好地利用这些元素,设计出更加有用、健壮和灵活的类和接口

1、使类和成员的可访问性最小化

要区别设计良好的模块与设计不好的模块,最重要的因素在于,这个模块对于外部的其他模块而言,是否隐藏其内部数据和其他实现细节。设计良好的模块会隐藏所有的实现细节,把它的API与它的实现清晰的隔离开来。然后,模块之间只通过他们的API进行通信,一个模块不需要知道其他模块的内部工作情况。这个概念被称为封装,是软件设计的基本原则之一。

信息隐藏之所以非常重要的原因:它可以有效地解除组成系统的各模块之间的耦合关系,使得这些模块可以独立地开发、测试、优化、使用、理解、修改。这样可以加快系统开发的速度,因为这些模块可以并行开发。它也减轻了维护的负担,因为程序员可以更快地理解这些模块。虽然信息隐藏本身无论是对内还是对外都不会带来更好的性能,但是它可以有效地调节性能:1、隐藏的模块可以被进一步优化,而不会影响其他模块的正确性。2、隐藏模块提高了软件的可重用性,因为模块之间并不紧密相连,除了开发这些模块所使用的环境(系统)外,他们在别的环境(系统)中往往也很有用。3、信息隐藏降低了构建大型系统的风险,因为即使整个系统不可用。但是这些独立的模块却有可能是可用的。

1、第一规则很简单:尽可能地使每个类或者成员不被外界访问。换句话说,应该使用与你正在编写的软件对应功能相一致的、尽可能最小的访问级别。

2、实例域决不能是公有的如果域是非final的,或者是指向一个可变对象的final引用,一旦使这个域成为公有的,就放弃了对存储在这个域中的值进行限制的能力,包含公有域的类不是线程安全的。同样的建议适用于静态域和长度非零的数组。

2、在公有类中使用访问方法而非公有域

class Point{
     public doulbe x;
     public double y;
}

由于类没有封装,数据域是可以直接访问的,所以如果不改变API,就无法改变它的数据表示法,业无法强加任何约束条件;当域被访问的时候,无法采取任何辅助行为。应该用包含私有域和公有访问方法(get/set)的类代替。如果公有类暴露了它的数据域,要想在将来改变其内部的表示法是不可能的,因为公有的类的客户端代码已经遍布各处了。

使可变性最小化

不可变类,要遵循下面五条规则:
1、不要提供任何修改对象状态的方法
2、保证类不会扩展。这样可以防止粗心或者恶意的子类假装对象的状态已经改变,从而破坏该类的不可变行为。一般使用final
3、使所有域都是final。通过系统的强制方式,表明你的意图
4、使所有域都成为私有的
5、确保对于任何可变组件的互斥访问。如果类具有指向对象的引用,则必须确保该类的客户端无法指向这些对象的引用。并且,永远不要用客户端提供的对象引用来初始化这样的域。

不可变对象本质上市现场安全的,它们不要求同步。当多个线程并发访问这样的对象时,它们不会招到破坏,无需做任何拷贝。

不可变类真正唯一的缺点是,对于每个不同的值都需要一个单独的对象。创建这种对象的代价可能很高。处理这种问题有两种方法。第一种办法,先猜测经常用到那些多步骤的操作,然后将它们作为基本类型提供。如果某个多步骤操作已经作为基本类型提供,不可变的类就可以不必在每个步骤单独创建一个对象。如果不可猜测则可以提供一个公有的配套类。如String和StringBuilder。

对于有些类而已,不可变性是不且实际的,如果类不能做成是不可变的,任然应该尽可能地限制它的可变性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值