Effective Java笔记(17)使可变性最小化

WGCNA加权基因共表达网络分析(1)简介、原理 WGCNA简介 WGCNA(Weighted Gene Co-Expression Network Analysis, 加权基因共表达网络分析),鉴定表达模式相似的基因集合(module),解析基因集合与样品表型之间的联系,绘制基因集合之间的调控网络并鉴定关键调控基因 WGCNA适用于复杂的转录组数据(样本数目较多) 研究不同器官/组织类型和不同阶段的发育调控、生物和非生物胁迫的不同时间响应机制 WGCNA原理 原理概要 1.构建基因共表达网络:先构建基因共表达网络,通常利用两两基因之间的表达模式来计算 阅读详情

        不可变类是指其实例不能被修改的类 。 每个实例中包含的所有信息都必须在创建该实例的时候就提供,并在对象的整个生命周期( lifetime )内固定不变 。Java 平台类库中包含许多不可变的类,其中有 String 、基本类型的包装类、Biginteger 和 BigDecimal 。 存在不可变的类有许多理由:不可变的类比可变类更加易于设计、实现和使用 。 它们不容易出错,且更加安全 。

为了使类成为不可变,要遵循下面五条规则:

  • 不要提供任何会修改对象状态的方法 (也称为设值方法) 。
  • 保证类不会被扩展 。 这样可以防止粗心或者恶意的子类假装对象的状态已经改变,从而破坏该类的不可变行为 。 为了防止子类化,一般做法是声明这个类成为 final 的 ,但是后面我们还会讨论到其他的做法 。
  • 声明所有的域都是 final 的 。 通过系统的强制方式可以清楚地表明你的意图 。 而且,如果一个指向新创建实例的引用在缺乏同步机制的情况下,从一个线程被传递到另一个线程,就必须确保正确的行为,正如内存模型中所述。
  • 声明所有的域都为私有的 。 这样可以防止客户端获得访问被域引用的可变对象的权限,井防止客户端直接修改这些对象 。 虽然从技术上讲,允许不可变的类具有公有的 final域,只要这些域包含基本类型的值或者指向不可变对象的引用,但是不建议这样做,因为这样会使得在以后的版本中无法再改变内部的表示法。
  • 确保对于任何可变组件的互斥访问 。 如果类具有指向可变对象的域,则必须确保该类的客户端无法获得指向这些对象的引用。 并且,永远不要用客户端提供的对象引用来初始化这样的域,也不要从任何访问方法( accessor )中返回该对象引用 。 在构造器、访问方法和 readObject 方法中请使用保护性拷贝技术 。

        下面是个稍微复杂一点的例子:

public final class Complex
{
{
    private final double re;
    private final double im;

    public Complex(double re, double im) {
        this.re = re;
        this.im = im;
    }

    public double realPart() {
        return re;
    }

    public double imaginaryPart() {
        return im;
    }

    public Complex plus(Complex c) {
        return new Complex(re + c.re, im + c.im);
    }

    public Complex minus(Complex c) {
        return new Complex(re - c.re, im - c.im);
    }

    public Complex times(Complex c) {
        return new Complex(re * c.re - im * c.im, re * c.im + im * c.re);
    }

    public Complex dividedBy(Complex c) {
        double tmp = c.re * c.re + c.im * c.im;
        return new Complex((re * c.re + im * c.im) / tmp, (im * c.re - re * c.im) / tmp);
    }

    @Override
    public boolean equals(Object o) {
        if (o == this)
            return true;
        if (!(o instanceof Complex))
            return false;
        Complex c = (Complex) 0;

        return Double.compare(c.re, re) == 0 && Double.compare(c.im, im) == 0;
    }

    @Override
    public int hashCode() {
        return 31 * Double.hashCode(re) + Double.hashCode(im);
    }

    @Override
    public String toString() {
        return "(" + re + " + " + im + "i)";
    }
}

        这个类表示一个复数( complex number ,具有实部和虚部) 。 除了标准的 Object 方法之外,它还提供了针对实部和虚部的访问方法,以及 4 种基本的算术运算 : 加法、减法、乘法和除法 。 注意这些算术运算如何创建井返回新的 Complex 实例,而不是修改这个实例 。大多数重要的不可变类都使用了这种模式 。 它被称为函数的( functional )方法,因为这些方法返回了一个函数的结果,这些函数对操作数进行运算但并不修改它 。 与之相对应的更常见的是过程的(procedural)或者命令式的( imperative )方法,使用这些方法时,将一个过程作用在它们的操作数上, 会导致它的状态发生改变 。 注意,这些方法名称都是介词(如plus ),而不是动词(如 add ) 。 这是为了强调该方法不会改变对象的值 。Biginteger 类和 BigDecimal 类由于没有遵守这一命名习惯,就导致了许多用法错误 。

        如果你对函数方式的做法还不太熟悉,可能会觉得它显得不太自然 ,但是它带来了不可变性,具有许多优点 。 不可变对象比较简单 。 不可变对象可以只有一种状态,即被创建时的状态 。 如果你能够确保所有的构造器都建立了这个类的约束关系,就可 以确保这些约束关系在整个生命周期内永远不再发生变化,你和使用这个类的程序员都无须再做额外的工作来维护这些约束关系 。 另一方面,可变的对象可以有任意复杂的状态空间 。 如果文档中没有为设值方法所执行的状态转换提供精确的描述,要可靠地使用可变类是非常困难的,甚至是不可能的 。

        不可变对象本质上是线程安全的,它们不要求同步 。 当多个线程并发访问这样的对象时它们不会遭到破坏 。 这无疑是获得线程安全最容易的办法 。 实际上,没有任何线程会注意到其他线程对于不可变对象的影响 。 所以, 不可变对象可以被自由地共享 。 不可变类应该充分利用这种优势,鼓励客户端尽可能地重用现有的实例 。 要做到这一点,一个很简便的办法就是 : 对于频繁用到的值,为它们提供公有的静态 final 常量 。 例如,Complex 类有可能会提供下面的常量 :

public static final Complex ZERO = new Complex(0, 0);
public static final Complex ONE = new Complex(1, 0);
public static final Complex I= new Complex(0, 1);

        这种方法可以被进一步扩展 。 不可变的类可以提供一些静态工厂,它们把频繁被请求的实例缓存起来 ,从而当现有实例可以符合请求的时候,就不必创建新的实例 。 所有基本类型的包装类和 Biginteger 都有这样的静态工厂 。 使用这样的静态工厂也使得客户端之间可以共享现有的实例,而不用创建新的实例,从而降低内存占用和垃圾回收的成本 。 在设计新的类时,选择用静态工厂代替公有的构造器可以让你以后有添加缓存的灵活性,而不必影响客户端 。

        “不可变对象可以被自由地共享”导致的结果是,永远也不需要进行保护性拷贝( defensive copy)。 实际上,你根本无须做任何拷贝 ,因为这些拷贝始终等于原始的对象 。 因此,你不需要,也不应该为不可变的类提供 clone 方法或者拷贝构造器。 这一点在 Java 平台的早期并不好理解,所以 String类仍然具有拷贝构造器,但是应该尽量少用它 。

        不仅可以共享不可变对象,甚至也可以共享它们的内部信息 。 例如,Biginteger 类内部使用了符号数值表示法。符号用一个 int 类型的值来表示,数值则用一个 int 数组表示 。negate 方法产生一个新的 Biginteger ,其中数值是一样的,符号则是相反的 。 它并不需要拷贝数组,新建的Biginteger 也指向原始实例中的同一个内部数组 。

        不可变对象为其他对象提供了大量的构件,无论是可变的还是不可变的对象 。 如果知道一个复杂对象内部的组件对象不会改变,要维护它的不变性约束是比较容易的 。 这条原则的一种特例在于,不可变对象构成了大量的映射键( map key )和集合元素( set element ); 一旦不可变对象进入到映射( map )或者集合( set )中,尽管这破坏了映射或者集合的不变性约束,但是也不用担心它们的值会发生变化 。

        不可变对象无偿地提供了失败的原子性 。 它们的状态永远不变,因此不存在临时不一致的可能性 。

        不可变类真正唯一的缺点是 , 对于每个不同的值都需要一个单独的对象 。 创建这些对象的代价可能很高,特别是大型的对象 。 例如,假设你有一个上百万位的 Biginteger,想要改变它的低位:

Bigintege moby = ...;
moby = moby.flipBit(0);

        flipBit 方法创建了一个新的 Biginteger 实例,也有上百万位长,它与原来的对象只差一位不同 。 这项操作所消耗的时间和空间与 Biginteger 的成正比 。 我们拿它与java.util.BitSet 进行比较 。 与 Biginteger 类似,BitSet 代表一个任意长度的位序列,但是与 Biginteger 不同的是,BitSet 是可变的 。BitSet 类提供了一个方法,允许在固定时间( constant time )内改变此“百万位”实例中单个位的状态:

B·itSet moby = ... ;
moby.flip(0);

        如果你执行一个多步骤的操作,并且每个步骤都会产生一个新的对象 ,除了最后的结果之外,其他的对象最终都会被丢弃,此时性能问题就会显露出来 。 处理这种问题有两种办法 。 第一种办法,先猜测一下经常会用到哪些多步骤的操作,然后将它们作为基本类型提供 。 如果某个多步骤操作已经作为基本类型提供,不可变的类就无须在每个步骤单独创建一个对象 。 不可变的类在内部可以更加灵活 。 例如, Biginteger 有一个包级私有的可变“配套类”( companing class ),它的用途是加速诸如“模指数”( mo dular exponentiation )这样的多步骤操作 。由于前面提到的诸多原因,使用可变的配套类比使用 Biginteger 要困难得多,但幸运的是,你并不需要这样做 。 因为 Biginteger 的实现者已经替你完成了所有的困难工作 。

        如果能够精确地预测出客户端将要在不可变的类上执行哪些复杂的多阶段操作,这种包级私有的可变配套类的方法就可以工作得很好 。 如果无法预测,最好的办法是提供一个公有的可变配套类 。 在 Java 平台类库中,这种方法的主要例子是 String 类,它的可变配套类是 StringBuilder (及其己经被废弃的祖先 StringBuffer ) 。

        现在你已经知道了如何构建不可变的类,并且了解了不可变性的优点和缺点,现在我们来讨论其他的一些设计方案 。 前面提到过,为了确保不可变性,类绝对不允许自身被子类化 。 除了“使类成为 final 的”这种方法之外,还有另外一种更加灵活的办法可以做到这一点 。 不可变的类变成 final 的另 一种办法就是,让类的所有构造器都变成私有的或者包级私有的,并添加公有的静态工厂( static factory )来代替公有的构造器(详见第 1 条) 。 为了具体说明这种方法,下面以 Complex 为例,看看如何使用这种方法:

public class Complex {
    private final double re;
    private final double im;
    private Complex(double re, double im) {
        this.re = re;
        this.im = im;
    }
    public static Complex valueOf(double re, double im) {
        return new Complex(re, im);
    }
    ...// Remainder unchanged
}

        这种方法虽然并不常用,但它通常是最好的替代方法 。 它最灵活,因为它允许使用多个包级私有的实现类 。 对于处在包外部的客户端而言,不可变的类实际上是 final 的,因为不可能对来自另一个包的类 、 缺少公有的或受保护的构造器的类进行扩展 。 除了允许多个实现类的灵活性之外,这种方法还使得有可能通过改善静态工厂的对象缓存能力,在后续的发行版本中改进该类的性能 。

        本条开头关于不可变类的诸多规则指出没有方法会修改对象,并且它的所有域都必须是 final 的 。 实际上,这些规则比真正的要求更强硬了一点,为了提高性能可以有所放松 。 事实上应该是这样:没有一个方法能够对对象的状态产生外部可见( externally visib le )的改变 。然而,许多不可变的类拥有一个或者多个非 fina l 的域 , 它们在第一次被请求执行这些计算的时候,把一些开销昂贵的计算结果缓存在这些域中 。 如果将来再次请求同样的计算,就直接返回这些缓存的值,从而节约了重新计算所需要的开销 。 这种技巧可以很好地工作,因为对象是不可变的,它的不可变性保证了这些计算如果被再次执行,就会产生同样的结果 。

        总之,坚决不要为每个 get 方法编写一个相应的 set 方法 。 除非有很好的理由要让类成为可变的类 ,否则它就应该是不可变的 。 不可变的类有许多优点,唯一的缺点是在特定的情况下存在潜在的性能问题 。 你应该总是使 一些小的值对象。 你也应该认真考虑把一些较大的值对象做成不可变的,例如 String 和 Biginteger 。 只有当你确认有必要实现令人满意的性能时,才应该为不可变的类提供公有的可变配套类 。

        对于某些类而言,其不可变性是不切实际的 。 如果类不能被做成不可变的,仍然应该尽可能地限制它的可变性 。 降低对象可以存在的状态数,可以更容易地分析该对象的行为,同时降低出错的可能性 。 因此,除非有令人信服的理由使域变成非 final 的 ,否则让每个域都是final的 。 结合这条的建议和第 15 条的建议,你自然倾向于 : 除非有令人信服的理由要使域变成是非 final的,否则要使每个域都是 private final 的 。

        构造器应该创建完全初始化的对象 ,并建立起所有的约束关系 。 不要在构造器或者静态工厂之外再提供公有的初始化方法,除非有令人信服的理由必须这么做 。 同样地,也不应该提供“重新初始化”方法(它使得对象可以被重用,就好像这个对象是由另一不同的初始状态构造出来的一样) 。 与所增加的复杂性相比,“重新初始化”方法通常并没有带来太多的性能优势 。

        通过 CountDownLatch 类的例子可以说明这些原则 。 它是可变的,但是它的状态空间被有意地设计得非常小 。 比如创建一个实例,只使用一次,它的任务就完成了 : 一旦定时器的计数达到零,就不能重用了 。

        最后值得注意的一点与本条目中的 Complex 类有关 。 这个例子只是被用来演示不可变性的,它不是一个工业强度的复数实现 。 它对复数乘法和除法使用标准的计算公式,会进行不正确的四舍五入,并且对复数 NaN 和无穷大也没有提供很好的语义。

利用dpabi和restplus提取ROI灰质体积学习笔记 目录前言一、数据准备二、利用dpabi提取ROI灰质体积三、restplus提取ROI灰质体积 前言 我利用SPM/CAT12进行灰质、白质、脑脊液分割之后分别已经得到各自的图像文件,在全脑水平已经做了统计分析。如果还想要进一步进行ROI的统计分析或者与量表等临床资料做相关分析,就需要提取ROI灰质体积。几个月没动过这数据了,突然心血来潮想学一下如何提取ROI灰质体积,以此篇博客记录我的提取ROI灰质体积学习过程。提取ROI灰质体积的方法及软件有许多种,本人尝试了dpabi和restplus。 一、数据准备 阅读详情

相关推荐

ZYNQ新手必看:你的PS端DDR和QSPI配置真的对了吗?从原理到实操的避雷指南

本文深入解析ZYNQ PS端外设配置的关键要点,特别是DDR匹配和QSPI时钟优化的实战技巧。通过详细案例和配置清单,帮助开发者避免常见错误,确保系统稳定性和启动可靠性。适合ZYNQ新手和需要优化最小系统的开发者参考。

weixin_28675839的博客 445

effective java 读书笔记——类和接口

上周因为准备考试等一堆原因,没空看书,今天补上一点。 类和接口是java程序设计语言的核心,它们也是java语言的基本抽象单元,java语言提供了很多强大的基本元素,供程序员设计类和接口,这一章讲的是一些指导原则,可以设计出更加有用,健壮和灵活的类和接口。 第1条:使类和成员的可访问性最小化 首先说一个概念:模块之间只能通过它们的API进行通信,一个模块不需要知道其他模块的内...

weixin_30550081的博客 181

Latex下使用JabRef添加参考文献

文章目录 前言 一、pandas是什么? 二、使用步骤 1.引入库 2.读入数据 总结 前言 Latex可以手动添加参考文献,但文献过多时,使用JabRef软件相对方便。 提示:以下是本篇文章正文内容,下面案例可供参考 一、JabRef安装 网址:http://www.jabref.org 打开网址后,点击“Download” 进入如下页面后,选择 portable (便携版,无需安装),下载后是一压缩包,打开即可使用。 二、使用 1.创建库 ...

sz3076799的博客 3467

Effective Javax学习笔记--使可变性最小

对于被判断无需进行不可变类是指其实例在初始化以后不可以被修改的类。不可变类的每一个实例的所有信息在创建该实例的时候都应该被提供,并在整个生命周期中固定不变。那要符合什么原则才能够真正保证类的不可变呢?重点就是setter方法。如果类允许被扩展,则子类可以通过改写父类的相关方法破坏其不可变性。所有内部成员的引用在指向成员的初始化值后不能再被更改。外部无法访问修改成员变量不能直接向外部的引用返回内部私有类实例的引用,这样会使得内部可变实例的引用有内外部两个。第2条其实有两种实现方式,一是。

weixin_50353846的博客 940

告别JavaScript!C#通过WebAssembly在浏览器中实现“原生级“性能

C# + WebAssembly:前端开发的革命性替代方案 摘要:本文探讨了C#通过WebAssembly取代JavaScript开发前端应用的新趋势。文章分析了JavaScript的局限性(弱类型、回调地狱等),并详细介绍了C#+WebAssembly组合的优势:强类型系统、高性能、多线程支持和代码重用。技术实现方面,阐述了C#通过Mono/.NET编译为WebAssembly字节码的原理,重点介绍了Blazor框架的两种模式。文章还提供了实战指南,包括项目创建、多线程配置,以及一个与ChatGPT AP

墨夶的博客 946

安卓手机强制清理数据恢复出厂设置后无法设置密码怎么办?(分享亲身经历的有效解决方案)

📱安卓手机强制清数据恢复出厂设置后,竟无法设置锁屏密码!本文将解析问题根源,分享亲测有效的解决方案,帮你快速摆脱困扰🎉

XiaoqiangClub的博客 242

Effective Java读书笔记-使可变性最小化

存在不可变类的原因:不可变的类比可变的类更加易于设计、实现和使用。它们不容易出错且更加安全。使类变为不可变需要遵守的五项原则: 不要提供任何会修改对象状态的方法。 保证类不会被拓展。这样可以防止粗心或者恶意的子类假装对象的状态已经改变,从而破坏类的不可变行为。为了防止子类化,一般的做法是使类变为final的。 使所有的域都是final的。 使所有的域都变为私有的。 确保任何可变组件的互斥访问。如果类

G7S9R的专栏 472

SAP 批量修改 工艺路线 和 BOM

1、在运维的过程中经常会遇到用户需要批量更改组件,或者是批量更改数量,还是组件里面的一些标识,当处理这些批量数据处理的业务时,BOM的批量更改一个想到的就是CS20,但是CS20当BOM需要替换的时候就不是很适用。当前工作区域:选择 SAP_ITEM 对BOM行项目进行变更,工艺路线也是可以批量更改的,根据实际的业务进行选择,我这里选择的就是BOM的组件变更。5、本博客将使用新的一种方式进行BOM的批量变更,标准的事务代码:CEWB对BOM进行批量更改。3、使用LSMW的方式进行BOM的批量更改。

我小时候很黑的博客 4097

Java - 将可变性最小化

不可变类,即实例不能被修改的类,实例中包含的所有信息在对象的生命周期内固定不变。 常见的比如String、基本类型的封装类、BigDecimal、BigInteger。 相对与可变类,不可变更易于设计、实现、使用,且更稳定(less prone to error)更安全。 比如,不可变类本质上就是线程安全的,不需要做同步处理,使用起来也非常方便。 设计不可变类,我们有...

dengtangu7674的博客 168

已经下载了WSL2但Docker依然显示版本过旧无法使用,如何解决?

🏆本文收录于 《全栈Bug调优(实战版)》 专栏,该专栏专注于分享我在真实项目开发中遇到的各类疑难Bug及其深层成因,并系统提供高效、可复现的解决思路和实操方案。无论你是刚入行的新手开发者,还是拥有多年项目经验的资深工程师,本专栏都将为你提供一条系统化、高质量的问题排查与优化路径,助力你加速成长,攻克技术壁垒,迈向技术价值最大化与职业发展的更高峰🚀!

**My Coding Family** 2907

【ROS】ROS2导航Nav2:简介、安装、测试效果、错误处理

在ROS2中自动导航使用Nav2来实现。Nav2 使用几个独立的模块化服务,通过 ROS 2接口(例如动作服务器或服务)与行为树 (BT) 通信。Nav2 输入包括:TF转换、一个地图源、一个行为树 (BT) XML 文件和相关的传感器数据源;Nav2 输出速度命令;Nav2 支持多种机器人,比如:四足机器人、履带机器人、轮式机器人等。

郭老二 5083

Java学习笔记:使可变性最小化

不可变类是实例不能被修改的类。每个实例中包含的所有信息都必须在创建该实例的时候就提供,并在对象的整个声明周期内固定不变。例如String、BigInteger和BigDecimal类。不可变类更易于设计、实现和使用。 设计不可变类的原则: 不要提供任何修改对象状态的方法 保证类不会被扩展 使所有域都是final的 使所有的域都是私有的 确保对于任何可变组件的互斥访问 // Im...

yanfeichening 271

Claude Code 完整详解(Anthropic 官方 AI 编程 Agent)

它是运行在终端(Terminal)的 AI 编程代理,不是普通 IDE 插件;你用自然语言发指令,它自主规划步骤、读写项目文件、执行系统命令、排查 Bug、处理 Git 工作流,是能真正动手干活的 AI 程序员。真正的AI 开发代理人,不止写代码,还能执行开发全流程超长全局上下文,大型项目理解碾压传统补全工具终端原生 + IDE 双接入,开发流程无割裂代码质量、可读性、工程规范性普遍偏高权限安全机制完善,修改前预览、可随时中断回滚。

wange6906的博客 3156

Effective Java笔记:使可变性最小化

Effective Java》中明确指出,不可变对象的设计是代码安全性和可维护性的基础。在很多场景下,我们应尽可能减少类的可变性,甚至设计为完全不可变。尽管不可变类是优选,但在某些场景中,我们需要使用可变类(如对象需要频繁更新)。当对象的状态是不可变的时候,程序中许多异常状态根本不会发生。不可变对象提供了一种明确的行为保证:它们的状态不会发生变化。如果类中包含可变对象,不要将这些引用直接公开,而应提供不可变的视图或防御性拷贝。不可变对象的状态不能被更改,因此可以安全地在线程之间共享,无需显式同步。

eclipseC的博客 568

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

《Effective Java》第17条:使可变性最小化

原文P69:许多不可变的类拥有一个或者多个非 final的域,它们在第一次被请求执行这些计算的时候,把一些开销昂贵的计算结果缓存在这些域中。声明所有的域都是 final的。而且,如果一个指向新创建实例的引用在缺乏同步机制的情况下,从一个线程被传递到另一个线程就必须确保正确的行为,即必须是线程安全的。当然,如果想让一个类成为“不可变类”,方法不仅仅有 使类是 final 的,还有另一种更灵活的方式:让类的所有构造器都变成私有的或者包级私有的,并添加公有的静态工厂来代替公有的构造器。声明所有的域都为私有的。

TD_FAlmK的博客 505

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

《Effective Java》解读第17条:使可变性最小化

摘要:文章探讨了不可变类的概念与实现方法。不可变类指实例化后状态不可修改的类,如String和基本包装类。实现要点包括:不提供修改方法、定义final类、声明final私有字段、防御性拷贝可变组件。优点包括线程安全、对象共享、构建其他对象等,缺点是每个不同值需单独对象。解决方案是提供可变配套类(如StringBuilder)。建议优先选择不可变类,必要时限制可变性,字段尽量设为private final。实际项目中虽少用final定义不可变类,但final常量很常见。

Cosmoshhhyyy的博客 305

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

effective Java 学习笔记(第二弹)

整理自《effective Java 中文第3版》本篇笔记整理第3,4章的内容。

Willow的博客 1168

带你快速看完9.8分神作《Effective Java》—— 类和接口篇

???? Java学习:Java从入门到精通总结 ???? Spring系列推荐:Spring源码解析 ???? 最近更新:2022年1月7日 ???? 个人简介:通信工程本硕????、阿里新晋猿同学????。我的故事充满机遇、挑战与翻盘,欢迎关注作者来共饮一杯鸡汤 ???? 点赞 ???? 收藏 ⭐留言 ???? 都是我最大的动力! 15 使类和成员的可访问性最小化 面向对象语言设计时的两大“法宝”就是封装和解耦。其中,封装可以隐藏组件所有的实现细节,把API与实现清晰隔离开,因此也就解除组成系

如切如磋,如琢如磨 1957

Effective Java读书笔记

第一章 引言 本文用来记录Effective Java学习过程中的各个知识点,受此时能力所限,有些点可能讲的不太清楚,或者理解有错误的地方,请多多指教! 第二章 创建和销毁对象 第一条 用静态工厂方法代替构造器 可参考文章:https://blog.youkuaiyun.com/u014129886/article/details/89670049 总而言之,静态工厂方法和共有构造器各有各的用处,我们需要理解他们各自的长处,静态工厂经常更加合适。 此处的静态工厂方法与设计模式中的工厂模式不同,这里是一种构造

逆水行舟,不进则退 1441

Effective Java 使可变性最小化

不可变类是实例不能被修改的类。每个实例中包含的所有信息都必须在创建该实例的时候就提供,并在对象的整个生命周期内固定不变。Java平台包含的不可变类:String、基本类型的包装类、BigInteger、BigDecimal。不可变类比可变类更容易设计、实现和使用。 为了使类成为不可变,要遵循五条规则: 1.不要提供任何会修改对象状态的方法。 2.保证类不会被扩展,为了防止恶意子类假装对象状态被改变,从而破坏不可变。 3.使所有的域都是final的。 4.使所有的域都成为私有的,防止客户端获得.

菜园子丶For丨丶Tomorrow的博客 193

《Effective Java》读书笔记三

一、明确接口的核心作用定义类型:接口的主要目的是为了定义一种特定的行为规范和类型标识。它描述了一组方法签名,任何实现该接口的类都必须提供这些方法的具体实现。通过接口,我们可以以一种统一的方式来处理不同的实现类,而无需关心具体的实现细节。类型标识的重要性:接口作为一种类型,可以在代码中用于变量声明、方法参数和返回值类型等。这使得代码更加灵活和可扩展,因为可以在运行时根据实际情况传入不同的实现类,而无需修改调用代码。二、避免不恰当的使用不要在接口中定义常量以外的变量:接口不应该被用作存储数据的地方。

qq_41831136的博客 803

Effective Java – Item 17 最小化可变性

item17 · 最小化可变性 不可变对象的优点 不可变对象本质上是线程安全的,它们不要求同步 可以共享不可变对象,甚至也可以共享它们的内部信息 为其他对象提供了大量的构建(?) 无代价地提供了失败的原子性 缺点 每个不同的值都需要一个单独的对象 可以使用可变配套类解决 如 String 的可变配套类是 StringBuilder 不可变原则 不要提供任何会修改对象状态的方法(se...

AlbumenJ的博客 239

Effective Java笔记:使类和成员的可访问性最小化

即通过隐藏实现细节,仅暴露必要的接口,来降低模块之间的耦合性。在设计公共类时,需要特别小心它的 API,因为一旦发布,修改它可能会破坏跟它交互的代码。在声明类和成员时,尽可能限制其访问权限,使其可见性最小化。字段是不可变的,但它仍然破坏了封装,因为类的实现细节(如错误代码字符串)对外公开。修饰的数组或集合使得对内部数据的修改权限不受控制,这是一个常见的过失设计。实现类(如接口的具体实现)通常是特定于模块的细节,不应直接暴露给外部。,允许子类复用父类的逻辑,但仍需谨慎设计受保护的成员。

eclipseC的博客 1152

《Effective Java》阅读笔记 15使可变性最小化

1.不可变类的优势 不可变类只是其实例不能被修改的类。不可变的类比可变类更加易于设计、实现和使用。它们不容易出错,且更加安全。 Java 平台类库包含许多不可变的类,包括 String 类、基本类型包装类以及 BigInteger 类和 BigDecimal 类。 有很多很好的理由:不可变类比可变类更易于设计,实现和使用。 他们不容易出错,并且更安全。 2.如何设计不可变类 1.不要提供任何会修改对象状态的方法。 2.保证类不会被扩展。 3.使所有的域都是 final 的。 4.使所有的域都是私有的。 5.

weixin_41563161的博客 355

Effective Java笔记第三章类和接口第三节使可变性最小化

Effective Java笔记第三章类和接口 第三节使可变性最小化 1.不可变类只是其实例不能被修改的类。每个实例中包含的所有信息都必须在创建该实例的时候就提供,并在对象的整个生命周期内固定不变。6 2.不可变类需要遵守的规则: 1)不要提供任何会修改对象状态的方法。 2)保证类不会被扩展。这样可以防止粗心或者恶意的子类假装对象的状态已经改变,从而破坏该类的不可变行为。为了防止子类化,一般做法是使这个类成为final的。 3)使所有的域都是final的。通过系统的强制方式,这可以清楚地表明你的意图。而且,

zh123456_789的博客 190

Effective Java:使可变性最小化

1.什么是不可变类 需要的所有参数必须在实例化的时候都传进去。 对象中所有信息在对象的整个生命周期中都保持不变。 2.使类不可变的原则 不要提供任何修改对象状态的方法。 保证类不会被继承。 使所有的域都是final类型的。 使所有的域都是私有类型的。 确保对于任何可变组件的互斥性。 即,确保在该类的外部不会获取到该类中可变对象的引用。比如下面这个例子: public class MyObj...

添仔哥哥 504
上一篇: Java网络编程(二)流
下一篇: Effective Java笔记(18)复合优先于继承
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值