EffectiveJava
笔记
ThunderKing24
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
第十二章 序列化
第八十五条:其他方法优先于Java序列化序列化:将对象编码成字节流。反序列化:从字节流编码中重新构建对象。序列化的根本问题在于,其攻击面过于庞大,无法进行防护,并且它还在不断的扩大。避免序列化攻击的最佳方式是永远不要反序列化任何东西。在新编写的任何系统中都没有理由再使用Java序列化。永远不要反序列化不被信任的数据。白名单优于黑名单。第八十六条:谨慎的实现Serializable接口实现Serializable接口而付出的最大代价是,一旦一个类被发布,就大大降低了“改变这个类的实现”的灵活性原创 2020-09-13 08:32:10 · 143 阅读 · 0 评论 -
第十一章 并发
第七十八条:同步访问共享的可变数据为了在线程之间进行可靠的通信,也为了互斥访问,同步是必要的。千万不要使用Thread.stop方法。因为他本质上是不安全的,使用它会导致数据遭到破坏。除非读和写操作都被同步,否则无法保证同步起作用。虽然volatile只提供了同步的通信效果,但这个包还提供了原子性。将可变数据限制在单个线程中。让一个线程在短时间内修改一个数据对象,然后与其它线程共享,这是可以接受的,它只同步共享对象引用的动作。然后其他线程没有进一步的同步也可以读取对象,只要他没有被修改,这种对象原创 2020-09-13 08:31:47 · 94 阅读 · 0 评论 -
第十章 异常
第六十九条:只针对异常的情况才使用异常因为异常机制的设计初衷是用于不正常的情形,所以几乎没有JVM实现试图对他们进行优化,使他们与显式的测试一样快速。把代码放在try-catch块中反而阻止了现代JVM实现本来可能要执行的某些特定优化。对数组进行遍历的标准模式并不会导致冗余的检查。有些现代的JVM实现会将他们优化掉。异常应该只用于异常的情况下,他们永远不应该用于正常的控制流。设计良好的API不应该强迫他的客户端为了正常的控制流而使用异常。第七十条:对可恢复的情况使用受检异常,对编程错误使用运行时原创 2020-09-12 15:54:09 · 127 阅读 · 0 评论 -
第九章 通用编程
第五十七条:将局部变量的作用域最小化要使局部变量的作用域最小化,最有力的方法就是在第一次要使用它的地方进行声明。几乎每一个局部变量的声明都应该包含一个初始化表达式。如果在循环终止之后不再需要循环变量的内容,for循环就优于while循环。使用for循环与使用while循环相比还有另外一个优势:更简短,从而增加了可读性。最后一种将局部变量的作用域最小化的方法是使方法小而集中。第五十八条:for-each循环优先于传统的for循环三种常见的无法使用for-each的情况解构过滤、转换、平行迭代。原创 2020-09-12 15:53:24 · 146 阅读 · 0 评论 -
第八章 方法
第四十九条:检查参数的有效性对于公有的和受保护的方法,要用Javadoc的@throw标签在文档中说明违反参数值限制时会抛出的异常。在Java 7 中增加的Objects.requireNonNull方法比较灵活且方便,因此不必要再手工进行null检查。在方法执行他的计算任务之前,应该先检查他的参数,这一规则也有例外。一个很重要的例外是,在某些情况下,有效性检查工作非常昂贵,或者根本是不切实际的,而且有效性检查已隐含在计算过程中完成。然而,不加选择的使用这种方法将会导致失去失败原子性。有时候,某些计原创 2020-09-12 15:52:23 · 247 阅读 · 0 评论 -
第七章 Lambda和Stream
第四十二条:Lambda优于匿名类删除所有lambda参数的类型吧,除非他们的存在能够使程序变得更加清晰。Lambda没有名称和文档,如果一个计算本身不是自描述的,或者超出了几行,那就不要把他放在一个lambda中。Lambda限于函数接口,如果想创建抽象类的实例,可以用匿名类来完成,而不是用lambda。同样的,可以用匿名类为带有多个抽象方法的接口创建实例。最后一点,lambda无法获得对自身的引用。如果需要从函数对象的主体内部访问它,就必须使用匿名类。Lambda与匿名类共享你无法可靠的通过实现原创 2020-09-12 15:51:26 · 191 阅读 · 0 评论 -
第六章 枚举和注解
第三十四条:用enum代替int常量Java枚举类型的基本想法非常简单:这些类通过公有的静态final域为每个枚举常量导出一个实例。枚举类型没有可以访问的构造器,所以他是真正的final类。客户端不能创建枚举类型的实例,也不能对他进行扩展,因此不存在实例,而只存在声明过的枚举常量。换句话说,枚举类型时实例受控的。他们是单例的泛型化,本质上是单元素的枚举。将加班工资计算移到一个私有的嵌套枚举中,将这个策略枚举的实例传到PayrollDay中。之后PayrollDay枚举将加班工资计算委托给策略枚举,Pay原创 2020-09-12 15:50:55 · 149 阅读 · 0 评论 -
第五章 泛型
第二十六条:请不要使用原生态类型如果使用原生态类型,就失掉了泛型在安全性和描述性方面所有的优势。而为什么Java语言的设计者还要允许使用他们?为了提供兼容性。使用像List这样的原生态类型,就会失掉类型安全性,但是如果使用像List这样的参数化类型,则不会。无限制通配类型Set<?>和原生态类型Set之间有什么区别?通配符类型是安全的,原生态类型则不安全。由于可以将任何元素放进原生态类型的集合中,因此很容易破坏该集合的类型约束条件,但不能将任何元素(除了null之外)放到Collect原创 2020-09-12 15:50:12 · 136 阅读 · 0 评论 -
第四章 类和接口
第十五条:使类和成员的可访问性最小化封装(信息隐藏):隐藏所有的实现细节,把API与实现清晰的隔离开来,然后组件之间只通过API进行通信,一个模块不需要知道其他模块的内部工作情况。封装的原因:解耦。尽可能的使每个类或者成员不被外界访问。公有类的实例域决不能是公有的。包含公有可变域的类通常不是线程安全的。让类具有公有的静态final数组域或者返回这种域的访问方法,这是错误的。修正这个问题的方法:使公有数组变成私有的,并增加一个公有的不可变列表,或者也可以使数组变成私有的,并添加一个公有方法,它返原创 2020-09-12 15:49:32 · 209 阅读 · 0 评论 -
第三章 对于所有对象都通用的方法
第十条:覆盖equals时请遵守通用约定什么情况下不需要覆盖equals?类的每个实例本质上是唯一的。类没有必要提供“逻辑相等”的测试功能。超类已经覆盖了equals,超类的行为对于这个类也是合适的。类是私有的,或者是包级私有的,可以确定它的equals方法永远不会被调用。Equals方法实现了等价关系,其属性如下:自反性、对称性、传递性、一致性、非空性。实现高质量equals方法的诀窍:使用==操作符检查“参数是否为这个对象的引用”。使用instanceof操作符检查“参数是否为正确原创 2020-09-12 15:46:58 · 151 阅读 · 0 评论 -
第二章 创建和销毁对象
第一条:用静态工厂方法代替构造器优点:1.静态工厂方法有名称,更易被使用。2.不必在每次调用他们的时候都创建一个新对象。3.他们可以返回原返回类型的任何子类型的对象。4.所返回对象的类可以随着每次调用而发生变化,这取决于静态工厂方法的参数值。5.方法返回的对象所属的类,在编写包含该静态方法的类时可以不存在。{(注:服务提供者框架:多个服务提供者实现一个服务,系统为服务提供者的客户端提供多个实现,并把他们从多个实现中解耦出来)(注:服务提供者框架的重要组件:服务接口:提供者实现的。提供者注原创 2020-09-12 15:45:27 · 332 阅读 · 0 评论
分享