`

关于"非可变类"的讨论

阅读更多

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  
工作上的一点整理, 希望与大家讨论, 指出不足.

相关推荐

    类模板实践-可变长数组类.7z

    在“类模板实践-可变长数组类”这个项目中,我们将深入探讨如何利用类模板来实现一个可变长数组的类。这个项目可能包含了一个源代码文件,如"类模板实践-可变长数组类.cpp",以及解决方案文件"类模板实践-可变长数组...

    可变速率可变功率MQAM自适应方案

    为了克服这一挑战,研究者提出了各种自适应调制与编码技术,其中本文讨论的可变速率可变功率MQAM调制方案是一种重要的实现方式之一。 #### 技术原理与实现 ##### 香农容量与自适应传输 文章首先回顾了衰落信道下...

    c#调用c++的可变参数

    我们将讨论P/Invoke机制、C#中的平台调用以及如何处理C++的可变参数。 C#是一种类型安全的.NET Framework编程语言,而C++则是一种更底层的语言,支持更灵活的内存管理和更低级别的系统调用。在C#中调用C++函数,...

    行业-电子政务-用于存储多数据的非易失电可变存储器单元及其制造方法.zip

    综上所述,非易失性电可变存储器单元是电子政务领域不可或缺的组成部分,而这篇文档则可能提供了关于其设计和制造的深入理解,对于电子政务系统的硬件开发者、系统集成商以及研究者来说具有很高的参考价值。

    SVM.rar_X6W_svm 分类_svm非线性分类_非线性SVM

    标题中的"SVM.rar_X6W_svm 分类_svm非线性分类_非线性svm"暗示了我们讨论的主题是关于如何利用SVM处理非线性分类问题,且是基于MATLAB平台的实现。在实际应用中,很多数据集并不遵循简单的线性关系,因此理解非线性...

    通用可变增益放大器

    ### 通用可变增益放大器的关键技术及实现 #### 概述 本文将深入探讨一个自研实验项目——通用可变增益放大器的设计...通过对关键技术和组件的详细讨论,本文为读者提供了一个深入了解通用可变增益放大器设计的视角。

    【考前三个月】(江苏专用)2015高考数学 数学思想方法篇 专题3 关于分类讨论的再研究

    - 逐类讨论,分步解决; - 归纳总结,得出最终结论。 在具体的应用中,我们可以看到分类讨论法在不同题型中的体现: 1. 概念与计算:如例1所示,集合B包含于集合A,需要根据一元二次方程的根的情况进行分类讨论...

    2019年简易数控可变增益放大器仿真.zip

    在电子设计领域,可变增益放大器(Variable Gain Amplifier, VGA)是一种重要的电路模块,它允许根据需要调整放大倍数。本项目聚焦于2019年江西省电子设计专题赛中的一款简易数控可变增益放大器的仿真工作。通过这个...

    行业分类-设备装置-一种金黄色葡萄球菌特异性鸡卵黄免疫球蛋白可变区单链抗体及用途.zip

    本篇内容可能讨论了一种新型的抗体,即鸡卵黄免疫球蛋白(IgY)的可变区单链抗体,这种抗体可能具有针对金黄色葡萄球菌的特异性。 描述部分与标题相呼应,再次强调了主题是关于金黄色葡萄球菌特异性的鸡卵黄免疫球...

    非编程类题1

    6. **常量指针与指针常量**:`const int *p1` 指针指向的整型值不可变,而 `int *const p2` 指针本身不可变,其指向的整型变量的值可变。 7. **内存管理**:示例代码展示了动态内存分配,`int *p = new int(5)` ...

    行业分类-设备装置-基于可变模态分解的地震波衰减梯度估计方法.zip

    而可变模态分解是一种信号处理技术,用于非线性、非平稳信号的分析,它能够将复杂信号分解为多个独立的模态分量,每一部分都对应不同的频率特征和时间动态。 VMD是近年来发展起来的一种数据处理工具,相比传统的...

    行业分类-设备装置-在可变形状媒体上打印的设备、系统和方法.zip

    在可变形状媒体上打印的设备、系统和方法是现代印刷技术的一个重要研究领域,它涉及到如何在非平面或形状多变的表面上实现高质量、高效率的印刷。这一技术不仅扩展了传统印刷的边界,还为个性化定制和创新设计提供了...

    softmax变区段非线性双拟合方法及其FPGA实现.pdf

    在讨论标题中提到的“softmax变区段非线性双拟合方法及其FPGA实现”之前,我们首先需要了解softmax函数、非线性拟合方法、FPGA的基本概念和技术细节。 softmax函数是一种在机器学习中常用的函数,尤其应用于多分类...

    第一届全国大学生数学竞赛(非数学类)试题及答案

    同时,可与其他同学分享讨论,共同进步。 总之,全国大学生数学竞赛(非数学类)是检验和提升大学生数学能力的重要平台,通过认真备考和积极参与,学生不仅可以深化数学知识,还能培养解决问题的能力,为个人发展...

    【独家高薪面试题库】与【实战配套练习演练】7.优先级可变与不可变1

    Java中的`String`类被认为是不可变的,这意味着一旦创建了一个`String`对象,其内容就不能被修改。这是因为在Java中,字符串是通过字符数组实现的,并且`String`对象在创建后其引用指向的字符数组是固定的。尝试改变...

    可变增益放大器的实现方法.pdf

    本文旨在从实际应用角度探讨可变增益放大器的各种实现方法及其特点,并针对这些实现方法在具体应用场景中可能遇到的重要技术问题进行深入讨论。这对于用户正确选择和使用可变增益放大器具有重要的参考价值。 #### ...

    基于时间反演不变与可变统一的混沌模型

    该文档介绍了一篇关于混沌理论的论文,论文的标题是“基于时间反演不变与可变统一的混沌模型”,作者为黄弋石和梁艳。文章的核心内容是提出一个混沌模型,用来解释时间宏观反演不变、微观反演部分不变和微观反演部分...

    两类基于MATLAB的非线性微分方程数值解的算法研究 (1).pdf

    文章通过分析和实现两类算法,建立了四阶定步长Runge-Kutta算法和Lorenz模型的MATLAB算法结构,并针对变步长情形下的误差控制进行了详细讨论。最终,通过绘制基于MATLAB的Lorenz系统数值解图形,提出了在可接受误差...

Global site tag (gtag.js) - Google Analytics