《Effective Java》笔记

Java语言支持四种类型:接口、类、数组、基本类型

类的成员由它的域field、方法、成员类、成员接口组成。

方法的签名signature由它的名称和所有参数类型组成,签名不包括它的返回类型。

API元素:类、接口、构造器、成员、序列化形式。

第二章  创建和销毁对象  7条

第1条  用静态工厂方法替代构造器

1 public static Boolean valueOf(boolean b){
2
3   return b?Boolean.TRUE : Boolean.False;
4
5 }

这样的好处是

  1、调用的时候有方法名,可以提供更多的信息。

  比存在多个入参一样的构造函数的时,用入参顺序互相区分好的多。

1 BigInteger(int,int Random);
2
3 BigInteger.makePrime(int,int Random);//多方法,可以有更多说明

  2、不用再每次调用的时候都创建一个新对象。

  可以让不可变类使用预先构建好的实例,或者缓存实例重复利用。

  可以控制每个类都是Singleton或者不可实例化的。这样就可以用a==b代替a.equals(b)来提高性能。

  3.可以返回原返回类型的任何子类型的对象,在选择返回类时有了更大的灵活性。

  API可以返回对象,又不会让对象的类变成公有的。使得API变得简洁。私有的类不显示,使用public的接口调用  private static的实现。同时接口的实现还能不断的变化,对调用者透明。如:

 1     public static <T> int binarySearch(List<? extends T> list, T key, Comparator<? super T> c) {
 2         if (c==null)
 3             return binarySearch((List<? extends Comparable<? super T>>) list, key);
 4
 5         if (list instanceof RandomAccess || list.size()<BINARYSEARCH_THRESHOLD)
 6             return Collections.indexedBinarySearch(list, key, c);
 7         else
 8             return Collections.iteratorBinarySearch(list, key, c);
 9     }
10
11     private static <T> int indexedBinarySearch(List<? extends T> l, T key, Comparator<? super T> c) {

  4、创建参数化类型实例,是的代码更简洁 (现在关于泛型的已经改进)

1 Map<String,List<String>> m = new HashMap<String,List<String>>()
2
3 //改进为
4
5  public static<K,V> HashMap<K,V> newInstance(){
6
7         return new HashMap<K,V>();
8
9       }

第2条  遇到多个构造器参数时要用构建器

当一个类的构造方法中需要传入许多参数,且除去几个必须的,还有很多可选的参数,可以用构建器来构建对象。这个在Google的DataStore中也比较常见。

 1   //Builder Pattern
 2   public class NutritionFacts{
 3     private final int servingSize;
 4     private final int servings;
 5     private final int fat;
 6     private final int sodium;
 7
 8     public static class Builder{
 9       // Required param
10       private final int servings;
11       private final int servingSize;
12
13       //Optional parameters - initialized to default values
14       private int fat = 0;
15       private int sodium = 0;
16
17       public Builder(int servingSize, int servings){
18         this.servingSize = servingSize;
19         this.servings = servings;
20       }
21       public Builder fat(int val){
22         fat = val;
23         return this;
24       }
25       public Builder sodium(int val){
26         sodium = val;
27         return this;
28       }
29       public NutritionFacts build(){
30         return new NutritionFacts(this);
31       }
32     }
33
34     private NutritionFacts(Builder builder){
35       servingSize = builder.servingSize;
36       servings = builder.servings;
37       fat = builder.fat;
38       sodium = builder.sodium;
39     }
40   }

调用:

1 NutritionFacts cocaCola = new NutritionFacts.Builder(240, 8).calories(100).sodium(35).build();

第3条  用私有构造器或者枚举类型强化Singleton属性

时间: 2024-12-19 18:49:09

《Effective Java》笔记的相关文章

SQL 笔记 By 华仔

-------------------------------------读书笔记------------------------------- 笔记1-徐 最常用的几种备份方法 笔记2-徐 收缩数据库的大小的方法 笔记3-徐 设置数据库自动增长注意要点 笔记4-徐 模仿灾难发生时还原adventurework数据库 示例 stopat 笔记5-徐 检查日志文件不能被截断的原因 笔记6-徐 检测孤立用户并恢复孤立用户到新的服务器 解决数据库镜像孤立用户问题 笔记7-徐 SQLSERVER日志记录

SQL笔记---多表左联

这是实际场景当中的一个例子,拿出来分析总结思路. -- SQL 查询 --SELECT  orderQuery.Rk_SkuCode ,        orderQuery.SkuName,        SUM(ISNULL(orderQuery.OrderTotal, 0))        - SUM(ISNULL(removeQuery.RemoveTotal, 0))        - SUM(ISNULL(pickQuery.PickTotal, 0))        - SUM(IS

SQL笔记---分页

随用随想,随用随记. 通过实际应用掌握SQL语句. 一. SQL分页 1. 第一种方法:利用ID大于多少进行筛选 SELECT TOP 20        *FROM    dbo.WMS_StockWHERE   ( Rk_SkuCode > ( SELECT MAX(Rk_SkuCode)                         FROM   ( SELECT TOP 40                                            *           

《HeadFirst SQL》笔记

规范化 0 约束 1 原子性 2 第一范式 1NF 3 数据模式 4 依赖 5 联接查询 6 交叉联接(AKA 笛卡尔联接,叉积) 7 内联接 8 子查询 9 外联接 10 自联接 11 集合 12 事务 13 ACID 14 管理事务 15 常用语句 16 注意 17 规范化 约束 NOT NULL UNIQUE PRIMARY KEY DEFAULT FOREIGN KEY:引用父表的某个唯一值引用完整性:插入外键列的值必须已经存在于父表的来源列中 --创建外键 create table i

SQL笔记1:SELECT及SELECT高级应用

T-SQL笔记1:SELECT及SELECT高级应用 本章摘要 1:安装AdventureWorks 2:基本运算符和表达式 3:between 4:like 5:escape 6:TOP 7:GROUP BY 7.1:GROUP BY ALL 7.2:HAVING 8:SELECT字句技术 8.1:使用DISTINCT消除重复值 8.2:返回拼接的结果 8.3使用INTO字句 9:子查询 9.1:子查询类型 9.2:代替表达式的查询 9.3:多层嵌套 10:比较使用 EXISTS 和 IN 的

金典 SQL笔记(6)

page223-索引 --利用SQL 语句创建索引 --CREATE INDEX 索引名称on 表名(字段 ,字段, 字段字段n) --索引名称必须为唯一的,字段 ,字段, 同意一个到多个 --范例为T_person 表中给FName创建索引索引名为 idx_person_name CREATE INDEX idx_person_name ON T_Person (FName) --删除索引 --drop index 表名索引名 DROP INDEX T_person.idx_person_na

Mybatis 项目开发实际常用SQL笔记总结

parameterType 和 resultType parameterType:单个参数用String,多个参数用map resultType:   可以是 Integer.String.Object    <select id="countGroupMasterByUid" parameterType="String" resultType="Integer">      SELECT              COUNT(id)

sql笔记/分页存储过程

[email protected]c#中进行++操作可以是整数或小数,sql中只能对整数进行++操作.char类型 适合存储长度波动较小不回收效率高varchar 类型 适合存储长度波动较大可以回收nchar代表unicode 存储内容包括汉字时候考虑加n SQL语句特点1不区分大小写2没有双引号所有字符串都包含在单引号3没有逻辑相等,逻辑相等和赋值一样都是用=4没有bool值得概念,但是在视图中可以输入true/false5也有关系运算符.6也有逻辑运算符 &&-- and || --o

sql笔记

1. 看下面sql,重点有两个,一个是distinct  ,一个是树形结构查询 select DISTINCT t.unit_code from t_unit_relation t where t.corp_tn='jiaozhougongan' start with t.unit_code='0001' connect by prior t.unit_code = t.unit_upcode 分析: ① distinct:去重复值 ② 树形结构查询,这个博客:http://www.cnblog

HeadFirst SQL 读书摘要

数据库都是用 圆柱形表示的. 数据库中包含表 表中包含行和列 行又叫记录record,  列又叫 字段field 创建数据库 create database mypipe_l; 选择数据库 use mypipe_l; 创建表 create table doughnut( name VARCHAR(10), type VARCHAR(6) ); 查看表 desc doughnut; 删除表 drop table doughnut; 插入数据 insert into doughnut (name,