`

关于"非可变类"的讨论

阅读更多

Effective Java中 第13条: 支持非可变类

 

这里对非可变类模式有很详细的讨论, 我个人是该模式的坚决支持者, 经过我手的东西我也都在实践这一点, 然而今天发现了一个关于非可变类的一个小插曲(应该还不算是麻烦 *_*).

 

说的这个"非可变类", 其实是java中的int类型(让我们叫他非可变的东西吧), 是他带给了我们这个故事.

 

同事和我有一个需求:

有三个int, 要将其中最小的一个值, 赋值为第二小的减一, 第二小的赋值为最大的减一.

注意, 不是取他们的最大值异或最小值,并将这个最大值或最小值减一.

因为后续还要用到这些a,b,c

也就是说我们改变一些东西的同时, 还要部分依赖于他们以前的一些信息(比如位置或次序)

 

这确实是我们不常做的一个事情,所以我们的第一反应是, 设计上的什么问题, 导致了这个蹩脚的需求.

但是我们还不能一下子把这个问题说出来.  对此, 我同事的观点是, 先别管设计.

理由是:"毕竟, 这不是一个复杂的功能, 先把它实现出来.  否则很丢人 ^-^"

 

我很认同, 于是我们开始了...

我们先考虑, 怎么把这个东西, 写的具有写美感,

显然一大堆if是可以办到的, 但是有些丑陋, 而且, 一旦增加到4个或n个数的时候, 我们的代码就会失效.

 

最后我们使用了下面的算法.

写道
step01 : 创建一个数组, 存放这些数值, 并对其进行排序

step02 : 对每一个int, 赋值等于数组中刚好比他大的那个值减一, 没有比他大的,则该int保持不变.

排序是为了利用现有的api, 关键是Step02.

 

解决问题之后, 我们的反思是.

我们有一组相同的东西, 他们要变化, 因此我们要把们放到数组或者容器中进行管理.

像这样没有使用集合类, 而孤立的使用了一组非可变类的时候,我们不应该"在改变他们的同时, 还依赖他们以前的值".

或者干脆都按照不可变类的方式使用它们更好.

 

恩, 由此看来, 这个小插曲确实不能作为非可变类给我们带来的麻烦,

(ps.一定会有这样的声音, 类不可变了, 在某些场合,会给我们带来麻烦, 对这种声音的回答我想应该是: 当感到蹩脚的时候, 首先想想是不是设计上面出了问题.)

 

非可变类在损失了一部分类似C/C++的灵活性的同时,给我们带来了更多的好处:

参:Effective Java中 第13条: 支持非可变类

我本想附上这一条的链接, 但遗憾网上没有找到相应的资源.

 

另附Object Mentor上的一篇blog:

A Wish List for the Next Mainstream Programming Language

分享到:
评论
2 楼 unsid 2009-01-14  
如果非API设计很少考虑这个问题吧,在设计API的事情确实是个比较重要的问题
1 楼 wjason 2009-01-14  
工作上的一点整理, 希望与大家讨论, 指出不足.

相关推荐

    论文研究 - 滑移作用下可变加速流的数值解

    在本文中,我们研究了由碟片产生的非稳态磁流体动力(MHD)流动,该碟片在无限远的情况下与第三级流体进行非同轴旋转并以可变的加速度运动。 假定流体满足圆盘上的滑移边界条件。 控制方程是三维的,并且本质上是...

    角扭转的非交换场论

    在动量空间中,非可交换性表现为矩的非可交换⋆变形和,这允许以平面波的扭曲卷积等效地定义⋆积。 作为一种应用,我们对λϕ4场论进行了一次分析,并讨论了其紫外/红外行为。 我们还分析了两种不同情况下的粒子...

    均布荷载下固支杆的非线性变形与位移分析

    基于Euler-Bernoulli梁的精确几何非线性理论,考虑轴线可伸长的条件下,两端固支弹性杆件受纵向均布荷载作用的几何非线性静平衡控制方程,并将其化为无量纲的微分方程组,应用打靶法数值分析了杆的非线性弯曲和轴线上各...

    非极大值抑制原理解析及实现流程

    这个局部代表的是一个邻域,邻域有两个参数可变,一是邻域的维数,二是邻域的大小。这里不讨论通用的NMS算法(参考论文《Efficient Non-Maximum Suppression》对1维和2维数据的NMS实现),而是用于目标检测中提取...

    Green-Schwarz弦的非阿贝尔T对偶性和Yang-Baxter变形

    我们针对等轴测(超)群G对... 我们发现,变形度量和B场是通过对开放弦和封闭弦之间的映射进行概括而获得的,Seiberg和Witten在讨论非交换场理论时也使用了该映射。 当应用于可积sigma模型时,这些变形将保留可积性。

    系数可变号的非线性偏差分方程ω度频密振动解 (2012年)

    对一类带有可变号系数的非线性偏差分方程的ω度频密振动性问题进行了研究,提出了此类偏差分方程的上/下度ω频密振动性准则.依据无穷双序列的频密测度概念及其性质,深入讨论了此类偏差分方程.仅仅利用方程的系数...

    论文研究-基于NoSQL的FITS文件头元数据存储和查询研究.pdf

    同时由于在数据检索中起着关键作用的FITS文件头的可变性,导致难以使用传统的关系型数据库来建立可适应这种变化需求的非结构化数据模型。针对这个难题,提出了使用NoSQL对天文上广泛使用的FITS文件头中所包含的可变...

    非定常二维复变边界元方法

    复杂可变边界元方法(CVBEM)程序已扩展到在矩形域上建模二维线性扩散偏微分方程(PDE)的应用。 这项工作中的方法适用于用Dirichlet边界条件和边界上等于边界条件的初始条件对扩散问题进行建模。 建模方法的基础是...

    初态偏移非线性系统跟踪控制的迭代学习算法

    基于迭代学习控制理论提出一种新的可变增益学习控制算法,并对系统初态的迭代学习律进行了讨论,利用算子理论证明在非线性系统中存在初态偏移时经过迭代学习后,输出仍能跟踪期望轨迹;对其收敛性进行数学证明,得到谱...

    一般单场通货膨胀中的全息非高斯性

    在本文中,我们讨论了较高的导数算子(例如(asμϕμμ))m的影响,已知它们会引起非平凡的声速并可能产生较大的非高斯性。 我们从变形的CFT相关器计算出完整的通货膨胀双谱。 我们还从运营商产品扩展的角度讨论...

    广义条件对称和变系数非线性扩散方程的解 (2012年)

    利用广义条件对称方法研究了一类变系数非线性扩散方程.当扩散项取D(u)=um(m≠-1,0,1)时,对该方程进行分类讨论,得到了该方程的一些精确解,这些精确解是泛函分离变量形式的解,它们可看作是广义泛函分离变量解的...

    L∞代数的自交换非交换规范理论

    研究了具有非恒定NC参数的非交换规范理论。 作为一种新颖的方法,我们建议此类理论应接纳一个基本的L∞代数,该代数不仅控制对称的作用,而且还控制理论的动力学。... 还讨论了一个非平凡的A∞代数的出现。

    电场作用下的变焦非球面液滴微透镜

    在实时进行光学检测的条件下,选择光固化材料,利用电场作用操控液滴透镜的面形实现变焦,在检测到较好的透镜面形和聚焦状态时,采用紫外光固化技术使液滴透镜固化,可制作具有良好光学成像和聚焦性能的非球面微透镜。...

    qs变形非简谐振子奇偶广义相干态及其量子统计特性* (2005年)

    结果表明,qs变形非简谐振子奇偶广义相干态均可呈现奇次方阶压缩效应和反聚束效应,当q和s取一定值时,在qs变形非简谐振子光场强度取值的一定范围内,呈现这些非经典特性的范围随着q偏离1越大和s取值越小而变大。

    Restacker.jl:将不可变项放回堆栈中

    重新堆叠器:将不可变项放回堆栈中 在Julia(从1.4版本开始)中,有时可能无法对包含堆分配对象的不可变对象进行堆栈分配,这就是为什么使用诸如view东西会大大降低性能的原因。 Restacker.jl提供了一个API ...

    跳变时滞系统非脆弱H∞滤波器的设计* (2009年)

    文中针对一类具有马尔可夫跳变参数的Ito类型不确定随机时滞系统,讨论了此类系统的鲁棒非脆弱H∞滤波器的设计问题.在被控对象及滤波器同时存在不确定性的情况下,使闭环滤波误差系统的鲁棒随机指数均方稳定,且干扰...

    《滑模变结构控制MATLAB仿真(第3版):先进控制系统设计方法》随书源码

    并且对一些实际的控制系统应用问题,如, 输出反馈系统的构成、状态检测、滑摸变结构控制系统的“抖, 振”等问题作了概要的讨论。书中各章节均配有相应的例子,便, 于理解与掌握。, 本书的读者以从事电气传动自动化...

    hanshu 以前讨论了由分立元器件或局部集成器件组成的正弦波和非正弦波信号产生电路,下面将目前用得较多的集成函数发生器8038作简单介绍。

    以前讨论了由分立元器件或局部集成器件组成的正弦波和非正弦波信号产生电路,下面将目前用得较多的集成函数发生器8038作简单介绍。 1.8038的工作原理 由手册和有关资料可看出,8038由恒流源I1、I2,电压比较器C1...

    滑模变结构控制MATLAB仿真(第3版)- 基本理论与设计方法(PDF+随书模型)

    滑模变结构控制MATLAB仿真(第3版)- 基本理论与设计方法(PDF+随书模型)滑模变结构控制作为一种特殊的非线性控制策略,已经开始, 被应用于各种控制系统中。由于它无需系统在线辨识而具有很好, 的鲁棒性,并且系统...

Global site tag (gtag.js) - Google Analytics