有效的Java –创建和销毁对象

创建和销毁对象(第2章)

这是Joshua Blochs的《 有效的Java》第2章的简短摘要。我仅包括与自己相关的项目。

静态工厂(项目1)

静态工厂与构造函数的一些优点:

  • 工厂方法的名称为构造函数添加了描述
  • 他们可以返回预先构造的对象,而不必总是返回new。
  • 他们可以返回声明的返回类型的任何子类型,甚至是非公共类。

使用静态工厂(例如,使用私有构造函数)的主要缺点是无法对该类进行子类化。

用构造器代替具有许多参数的构造器(项目2)

调用具有许多参数的构造函数可能很麻烦,因为它需要查看方法声明以了解参数代表什么。 这使得读取和调用这样的构造函数都很困难。

一种替代方法是使用无参数构造函数构造一个对象,然后使用设置器设置所需的字段(JavaBean模式)。 这种方法的缺点是,在设置不变式时,对象可能处于不一致状态。 此外,由于您提供的是setter,因此对象是不可变的,因此很难保证线程安全。

建筑商是第二种选择,两全其美。 生成器首先以可读和紧凑的方式“收集”参数,然后通过首先验证不变量是正确的来实例化对象。

由于建造者对于小班制可能会显得过大,因此本书建议将其用于具有四个以上参数的班级。 请注意,对于构造函数和静态工厂而言,构造函数都是替代方法。

与Singelton的一些陷阱(项目3)

  • 如果singelton未实现接口,则Singeltons使其难以测试其客户端,因为您无法模拟出singelton。
  • 如果将singeltons设置为可序列化的 ,则它们不再是singeltons,除非在反序列化时特别注意。
    • 实现单例的最佳方法是使用单元素枚举类型,这避免了序列化的问题。

避免创建不必要的对象(项目5)

创建对象时应小心。 重复使用昂贵的物品,但不要以防御性复制为代价(出于不变性–项目39)。 应优先于盒装基元使用基元,并且在执行自动装箱以消除不必要的对象创建时要格外小心。

消除过时的对象引用(项目6)

这些书显示了一个堆栈示例,其中弹出项目不会从内部数组中清空,从而使它们成为无法进行垃圾回收的过时引用。 内存泄漏和过时引用的公共来源:

  • 每当类管理自己的内存时 ,程序员都应该对内存泄漏发出警报。
  • 忘记缓存条目。 考虑将WeakHashMap用于缓存,该缓存仅在外部引用条目时才保存项目。
  • 缺少注销的监听器回调 。 同样在这里可以使用WeakHashMap

翻译自: https://www.javacodegeeks.com/2017/05/effective-java-creating-destroying-objects.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/349963.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【洛谷P2743】【poj 1743】[USACO5.1]乐曲主题Musical Themes

题目 还是板子题 因为旋律会同时加减一个数,所以我们在差分数组上做就好了 注意因为差分了,跨越的个数要少一个 基数排序循环写反了,调了好久 qwq /* Date : 2019-07-19 10:17:22 Author : Adscn (adscnqq.com) Link : https://www.cn…

exec导入 php,PHP exec运行一个文件

我正在尝试最后3个小时告诉PHP运行一个简单的文件.我在本地主机中使用wamp服务器用于Windows(Windows 8)我尝试过使用exec():echo exec(whoami);我得到了权威的回应.还测试了:if(function_exists(exec)) {echo "exec is enabled";}它可能有用吗…

远程连接Oracle 数据库连接报错ORA-12638身份检索失败

数据库版本:oracle11g 当使用navicate或者PLsql使用远程连接服务器的数据库的时候报错 RA-12638身份检索失败 因为是更换了个新电脑出现这种问题了,所以可以排除时服务器数据库的问题,问题应该出现在oracle的客户端上面; 通过修改…

java生成顺丰电子面单,顺丰拼多多电子面单设置教程

100%使用使用拼多多电子面单,无需解密,即可打单发货,让打单更加流畅,减少出错!不少商家有疑问,顺丰是月结的合作模式,不用充快递单号,是不是不支持拼多多电子面单呢?当然…

list.action.php,doAction.php里代码可以这样写,大大减少了重复的代码

//接收页面$mysqlinew Mysqli(localhost,root,root,test);if($mysqli->connect_errno){die(Connect Error:.$mysqli->connect_error);}$mysqli->set_charset(utf8);$username$_POST[username];$username$mysqli->escape_string($username);$password$_POST[passwor…

[Jobdu] 题目1530:最长不重复子串

题目描述:最长不重复子串就是从一个字符串中找到一个连续子串,该子串中任何两个字符都不能相同,且该子串的长度是最大的。 输入:输入包含多个测试用例,每组测试用例输入一行由小写英文字符a,b,c...x,y,z组成的字符串&a…

Spring Boot,@ EnableWebMvc和常见用例

事实证明,Spring Boot与标准Spring MVC EnableWebMvc不能很好地融合EnableWebMvc 。 添加注释时发生的事情是禁用了Spring Boot自动配置。 不好的部分(浪费了我几个小时)是,在任何指南中,您都找不到明确指出的内容。 …

php redirect with post,PHP – redirect并通过POST发送数据

你不能用PHP做这个。正如其他人所说,你可以使用cURL – 但是然后PHP代码成为客户端,而不是浏览器。如果您必须使用POST,那么唯一的方法就是使用PHP生成填充表单,并使用window.onload挂钩来调用javascript来提交表单。C。这里是解决…

php static方法的作用是什么,php static方法指的是什么

php static方法指的是用php中static关键字来定义静态方法和属性,static也可用于定义静态变量以及后期静态绑定,其使用语法如“public static $my_static foo;”。推荐:《PHP教程》Static(静态)关键字本页说明了用 static 关键字来定义静态方…

您好您拨打电话已停机_您好GroovyFX

您好您拨打电话已停机GroovyFX汇集了我最喜欢的两件事: Groovy和JavaFX 。 GroovyFX项目主页面将GroovyFX描述为“ [为JavaFX 2.0提供Groovy绑定”。 该页面上进一步描述了GroovyFX: GroovyFX是一种API,它使在Groovy中使用JavaFX变得更加简…

js中写java集合代码,JS实现JAVA的List功能

本次的文章给大家分享了关于JS实现JAVA的List功能的代码,有兴趣的朋友可以看一下function List(){var list new Array();/* 添加元素 */this.add function(obj){list[list.length] obj;}/* 根据下标获得元素 */this.get function(index){return list[index];}/*…

NOIP模拟测试6「那一天我们许下约定(背包dp)·那一天她离我而去」

那一天我们许下约定 内部题&#xff0c;题干不粘了。 $30分算法$ 首先看数据范围&#xff0c;可以写出来一个普通dp #include<bits/stdc.h> #define ll int #define A 2100 #define mod 998244353 using namespace std; ll f[1501][AAA],n,d,m; int main() {scanf("…

使用TestContainers提高测试性能

在我以前的测试文章中&#xff0c;我描述了如何使用TestContainers为数据库测试提供现实的测试环境。 此评论显示了缺点&#xff1a; …如上所述&#xff0c;似乎总是有一些缺点。 在这种情况下&#xff0c;启动Docker映像及其包含的所有内容的开销将增加您的总体构建时间。 提…

mysql 横向排列,mysql横向转纵向、纵向转横向排列的方法

初始化数据DROP TABLE IF EXISTS test_01;CREATE TABLE test_01 (id int(0) NOT NULL,user varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT 用户,km varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT …

VS2010常用快捷键自定义

VS的快捷键确实很多&#xff0c;不过对我来说实用的几个&#xff0c;要用的时候实在是按得别扭。所以重新设置了某些快捷键。 设置方法如下&#xff1a; 1.进入工具-选项 对话框 2.选择【环境】-【键盘】 3.在 【显示命令包含】 下面的对话框中输入你想重新定义快捷键的中文名&…

matlab光学毕业论文,光学信息处理实验的Matlab仿真.doc

摘要&#xff1a;光学实验系统往往比较精密和复杂&#xff0c;理论课堂教学中加入相关实验的演示往往比较费时&#xff0c;而且也不一定能得到正确的实验结果。随着计算机技术的发展&#xff0c;强大的运算性能和图形处理能力可以很好的解决这个问题&#xff0c;满足课堂教学中…

JavaScript方法——call和apply

1、相同点: a&#xff09; 产生的效果或作用完全相同&#xff1b; b&#xff09; 至少有一个参数&#xff1b; c&#xff09; 第一个参数必须有且是一个对象&#xff08;Object&#xff09;&#xff0c;因为就是这个家伙偷懒。 2、不同点: 传递参数的方式。 前提: 1、有两个对象…

阿帕奇跨域_阿帕奇骆驼备忘单

阿帕奇跨域轮询一个空目录&#xff08;并发送一个空消息&#xff0c;正文为空&#xff09;&#xff1a; from(file://temp?sendEmptyMessageWhenIdletrue)停止路线&#xff1a; .process(new Processor() {public void process(Exchange exchange) throws Exception {getConte…

天空之城 matlab,[转载]matlab演奏《天空之城》代码

%matlab演奏《天空之城》代码l_dao262; %将“l_dao”宏定义为低音“1”的频率262Hzl_re286; %将“l_re”宏定义为低音“2”的频率286Hzl_mi311; %将“l_mi”宏定义为低音“3”的频率311Hzl_fa349; %将“l_fa”宏定义为低音“4”的频率349Hzl_sao392; %将“l_sao”宏定义为低音“…

7.0上的新KIE持久性API

这篇文章介绍了即将到来的Drools和jBPM持久性api。 创建持久性api&#xff08;不绑定到JPA&#xff09;的动机是因为Drools和jBPM中的持久性直到7.0.0发行版才允许将替代性持久性机制与JPA完全集成。 尽管JPA是一个出色的api&#xff0c;但它与传统RDBMS模型紧密地结合在一起&a…