Effective java笔记3--类和接口1】的更多相关文章

Effective Java笔记一 创建和销毁对象 第1条 考虑用静态工厂方法代替构造器 第2条 遇到多个构造器参数时要考虑用构建器 第3条 用私有构造器或者枚举类型强化Singleton属性 第4条 通过私有构造器强化不可实例化的能力 第5条 避免创建不必要的对象 第6条 消除过期的对象引用 第7条 避免使用终结方法 第1条 考虑用静态工厂方法代替构造器 对于类而言, 最常用的获取实例的方法就是提供一个公有的构造器, 还有一种方法, 就是提供一个公有的静态工厂方法(static factory…
Java笔记---枚举类和注解 一.枚举类 自定义枚举类 方式一:JDK5.0之前自定义枚举类 class Seasons { //1. 声明Seasons对象的属性 private final String SeasonName; private final String SeasonDescrp; //2. 私有化类的构造器, 并给对象赋值初始化 private Seasons(String SeasonName, String SeasonDescrp) { this.SeasonDesc…
类与接口是Java语言的核心,设计出更加有用.健壮和灵活的类与接口很重要. 13.使类和成员的可访问性最小化 设计良好的模块会隐藏起所有的实现细节,仅使用API与其他模块进行通信.这个概念称为信息隐藏或封装,是软件设计的基本原则之一.信息隐藏可以是实现系统各模块的解耦,以使这些模块可以独立的开发.测试.优化.信息隐藏还提高了软件的可重用性,降低了构建大型系统的风险. java中实体的可访问性由实体声明的位置以及访问修饰符(private.不写.protected.public)共同决定.尽可能的…
一.使类和成员的可访问能力最小化 要想区别一个设计良好的模块与一个设计不好的模块,最重要的因素是,这个模块对于外部的其他模块而言,是否隐藏了内部的数据和其他的实现细节.一个设计良好的模块会隐藏所有的实现细节,把他的API与实现清晰的隔离开来.模块之间只能通过它们的API进行通信,一个模块不需要知道其他模块的内部工作情况.这个概念被称为信息隐藏(information hiding)或封装(encapsulation),是软件设计的基本原则之一. 信息隐藏的优点: 1.可以有效地解除一个系统中各个…
Object类的所有非final方法(equals.hashCode.toString.clone.finalize)都要遵守通用约定(general contract),否则其它依赖于这些约定的类(HashMap,HashSet等)将不能正常工作. 8.覆盖equals时请遵守通用约定 无需覆盖equals的情形: 类的每个实例本质上是唯一的.类代表的是活动实体而不是值的概念.(例如,类Thread) 不关心类"逻辑相等"的功能,从Object继承的equals实现已经足够.(例如,…
这篇笔记主要是抽象类和接口,还有简单介绍下三种设计模式:模板模式.工厂模式.命令模式 1.抽象方法和抽象类(1)抽象方法和抽象类都必须使用abstract修饰符来定义,包含抽象方法的类只能被定义成抽象类,抽象类里面可以没有抽象方法.抽象方法里面没有方法体.(2)抽象类不能被实例化,不能使用new关键字来调用抽象类的构造器来创建抽象类的实例,只能被当成父类来继承. package cn.lsl; public abstract class Shape { { System.out.println(…
单例模式:"一个类有且仅有一个实例,并且自行实例化向整个系统提供." 单例模式实现方式有多种,例如懒汉模式(等用到时候再实例化),饿汉模式(类加载时就实例化)等,这里用饿汉模式方法实现,也就是类加载就实例化,单例模式应用场景有很多,比如一个应用有一套窗口化界面,Servlet中只有一个实例,应用很广泛 package com.test; public class Singleton { private Singleton() {} private static final Single…
博主是一名苦逼的大四实习生,现在java从业人员越来越多,面对的竞争越来越大,还没走出校园,就TM可能面临失业,而且对那些增删改查的业务毫无兴趣,于是决定提升自己,在实习期间的时间还是很充裕的,期间自学了很多流行的技术(我差点信了),也重拾了之前忽略的数据结构和算法(虽然还是半吊子,总比一点不会好,哈哈),欢迎大家和我交流,特别是想提升自身技能的小伙伴,我的QQ是673793576,下面开始进入正题~~ 以前我看书的时候都是走马观花的看,看完以为都懂了,其实毛都不会,纯属浪费时间,最近在看2本书…
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将近8年的时间,但随着Java 6,7,8,甚至9的发布,Java语言发生了深刻的变化. 在这里第一时间翻译成中文版.供大家学习分享之用. 20. 接口优于抽象类 Java有两种机制来定义允许多个实现的类型:接口和抽象类. 由于在Java 8 [JLS 9.4.3]中引入了接口的默认方法(default met…
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将近8年的时间,但随着Java 6,7,8,甚至9的发布,Java语言发生了深刻的变化. 在这里第一时间翻译成中文版.供大家学习分享之用. 22. 接口仅用来定义类型 当类实现接口时,该接口作为一种类型(type),可以用来引用类的实例.因此,一个类实现了一个接口,因此表明客户端可以如何处理类的实例.为其他目的…
Effective Java --Comparable接口 compareTo方法是Comparable接口的唯一方法.类实现了Comparable接口,表明它的实例具有内在的排序关系. 自己实现compareTo方法应该注意的点: 自反性: x.compareTo(x) == 0 可传递性: x.compareTo(y)>0 && y.compareTo(z)>0 ==> x.compareTo(z) > 0 可逆性: x.compareTo(y) == -y.c…
泛型为集合提供了编译时类型检查. 23.不要在代码中使用原生态类型 声明中具有一个或多个类型参数的类或接口统称为泛型.List<E>是一个参数化类,表示元素类型为E的列表.为了提供兼容性,每个泛型都定义一个原生态类型,即不带任何实际类型参数的泛型名称.例如,List<E>的原生态类型为List. 使用原生态类型将逃避编译时的类型检查,失掉泛型在安全性和表述性方面的优势.出错时(运行时错误)代码所处的位置与包含错误的代码可能相距很远,难以调试.不应该在代码中使用原生态类型. 原生态类…
38.检查参数的有效性 绝大多数方法和构造器对于传递给它们的参数值都会有限制.如,对象引用不能为null,数组索引有范围限制等.应该在文档中指明所有这些限制,并在方法的开头处检查参数,以强制施加这些限制. 对于公有的方法,使用异常检查参数,并在Javadoc的@throws标签中说明违反参数限制时会抛出的异常. 对于非公有的方法,使用断言来检查参数.断言如果失败,将会抛出AssertionError.若它们没起作用,本质上不会有成本开销. 断言仅用于代码调试,不要在公有的API方法中使用断言,因…
30.用enum代替int常量 枚举类型是指由一组固定的常量组成合法值的类型.在java没有引入枚举类型前,表示枚举类型的常用方法是声明一组不同的int常量,每个类型成员一个常量,这种方法称作int枚举模式.采用int枚举模式的程序是十分脆弱的,因为int值是编译时常量,若与枚举常量关联的int发生变化,客户端就必须重新编译. java枚举类型背后的思想:通过公有的静态final域为每个枚举常量导出实例的类.因为没有可以访问的构造器,枚举类型是真正的final.客户端既不能创建枚举类型的实例,也…
1.类: 类是具有相同属性和方法的一组对象的集合,它为属于该类的所有对象提供了统一的抽象描述,其内部包括属性和方法两个主要部分.在面向对象的编程语言中,类是一个独立的程序单位,它应该有一个类名并包括属性和方法两个主要部分. Java中的类实现包括两个部分:类声明和类体.  1.1类的声明格式: [pbulic] [abstract/final] class className [extends Parentname]  [implements ] {Iname1,Iname2...} 其中,修饰…
编写访问数据库的Java程序还需要几个重要的类和接口. DriverManager类 DriverManager类处理驱动程序的加载和建立新数据库连接.DriverManager是java.sql包中用于管理数据库驱动程序的类.通常,应用程序只使用类DriverManager的getConnection()静态方法,用来建立与数据库的连接,返回Connection对象: static Connection getConnection(String url,String username,Stri…
一.将局部变量的作用域最小化      本条目与前面(使类和成员的可访问能力最小化)本质上是类似的.将局部变量的作用域最小化,可以增加代码的可读性和可维护性,并降低出错的可能性. 使一个局部变量的作用域最小化,最有力的技术是在第一次使用它的地方声明. 几乎每一个局部变量的声明都应该包含一个初始化表达式. 在循环中经常要用到最小化变量作用域这一个规则.for循环使你可以声明循环变量(loop varialbe),它们的作用域被限定在正好需要的范围值内(这个范围包括循环体,以及循环体之前的初始化.测…
一.序言 程序设计的几条基本原则: 1.清晰性和简洁性最为重要,模块的用户永远也不应该被模块的行为所迷惑,所以写良好的注释是必需的. 2.模块要竟可能小,但也不能太小,好一个深奥的哲学问题. 3.代码应该被重用,而不是应该被拷贝,拷贝的代码哪天就是你的灾难. 4.模块的依赖性应该尽可能地降到最小,低耦合是必须的. 5.错误应该尽早被检测出来,最好是在编译时刻,否则你的这次运行就白费了. 6.永远要注重自己写的代码是否足够清晰,正确,可用,健壮,灵活和可维护. Java语言支持的四种类型: 接口(…
一.检查参数的有效性 极大多数方法和构造函数都会对于传递给它们的参数值有某些限制. 对于公有的方法,使用Javadoc @throws标签(tag)可以使文档中记录下“一旦针对参数值的限制被违反之后将会被抛出的异常”.典型情况下, 这样的异常为IllegalArgumentException.IndexOutOfBoundException或者NullPointException.看一个例子: /** * @param m the modulus,which must be positive.…
Object 类        Object类 的主要作用        Object 类的常用方法             内容        虽然有了对象的向上转型,可以解决了参数的统一问题,但是面对JAVA 开发之中如此众多的开发类        所以现在就面临这样一个问题:参数类型怎么选择才能够保存所以的类对象呢?        为此java里面考虑到了此种情况有一个Object类        此类定义:public class Object        可以发现在整个对的java里…
参考java中的类的初始化顺序详解 package org.sample; class Bread { Bread() { System.out.println("Bread()"); } } class Cheese { Cheese() { System.out.println("Cheese()"); } } class Lettuce { Lettuce() { System.out.println("Lettuce()"); } } p…
Chapter 4 Classes and Interfaces Item 13: Minimize the accessibility of classes and members 一个好的模块设计会封装所有实现细节,模块之间只能通过他们公开的API进行交流.因为这些模块互不影响(loosely coupled),所以可以进行单独测试等等.所以为了封装,我们应该把每一个class或member弄得越inaccessible越好.顶层的class和interface只能是public或者defa…
一.使类和成员的可访问性最小化 1.尽可能地使每个类或者成员不被外界访问. 2.实例域决不能是共有的.包含公有可变域的类不是线程安全的. 3.除了公有静态final域的特殊情形之外,公有类都不应该包含公有域,并且确保公有静态final域所引用的对象不可变. 二.在公有类中使用访问方法而非公有域 1.如果类是包级私有的,或者是私有的嵌套类,直接暴露它的数据域并没有本质的错误. 2.公有类永远都不应该暴露可变的域. 三.使可变性最小化 不可变的类是指其实例不能被修改的类.为使类不可变,需要遵循以下五…
三.接口优于抽象类 java提供两种机制,可以用来定义一个允许多个实现的类型:接口和抽象类.由于java只允许单继承,所以,抽象类作为类型定义受到了极大的限制. 已有的类可以很容易被更新,以实现新的接口.你所需要做的是:增加要求的方法,如果这些方法原先还不存在的话:然后在类的声明上增加一个implements子句. 接口是定义mixin(混合类型)的理想选择.一个mixin是指这样的类型:一个类除了实现它的”基本类型(primary type)"之外,还可以实现这个mixin类型,以表明它提供了…
1.考虑用静态工厂方法代替构造器 类的一个实例,通常使用类的公有的构造方法获取.也可以为类提供一个公有的静态工厂方法(不是设计模式中的工厂模式)来返回类的一个实例.例如: //将boolean类型转换为Boolean类型 public static valueOf(boolean b) { return b ? Boolean.TRUE : Boolean.FALSE; } 使用静态工厂方法代替构造器的优势: 静态工厂方法有名称,更易读.静态工厂方法能够使用方法名称进行自注释,来描述被返回的对象…
66.同步访问共享的可变数据 JVM对不大于32位的基本类型的操作都是原子操作,所以读取一个非long或double类型的变量,可以保证返回的值是某个线程保存在该变量中的,但它并不能保证一个线程写入的值对于另一个线程是可见的.因此在读或写原子数据时,使用线程同步是有必须要的,否则将时线程间数据不一致. public class ThreadTest { private static boolean stopRequested; //原子操作 public static void main(Str…
45.将局部变量的作用域最小化 将局部变量的作用域最小化,可以增强代码的可读性和可维护性,并降低出错的可能性. Java允许在任何可以出现语句的地方声明变量(C语言中局部变量要在代码块开头声明),要使局部变量的作用域最小化,最好的方法是在第一次使用它的地方声明.局部变量的作用域从它被声明的点开始扩展,一直到外围块的结束处. 如果在循环终止之后不再需要循环变量的内容,for循环就优于while循环.for循环中变量的作用域范围更小,可以避免一些复制.粘贴错误,并且for循环更简短.可读性更强.如:…
Num1:使类和成员的可访问性最小化 要区别设计良好的模块与设计不好的模块,最重要的因素在于,这个模块对于外部的其他模块而言,是否隐藏其内部数据和其他实现细节.设计良好的模块会隐藏所有的实现细节,把它的API与它的实现清晰地隔离开来.也称呼为封装. 所以有这么一句话:尽可能地使每个类或者成员不被外界访问,可以包括实体声明中所出现的访问修饰符共同决定的,有四种访问级别,如下: 私有的,private 包级私有的,default 受保护的,protected 公有的,public Num2:在公有类…
获取类的实例的方法有很多种,在这很多种方法中,它们各有优缺,各有特点.这里,只介绍2中方法 1.使用构造方法 public class Person { private String sex; /** * <构造函数> */ public Person(String sex) { this.sex = sex; System.out.println("this is constructor method"); } } 调用如下: public static void mai…
充分发挥异常的优点,可以提高一个程序的可读性.可靠性和可维护性.如果使用不当的话,它们也会带来负面影响. 一.只针对不正常的条件才使用异常 先看一段代码: //Horrible abuse of exceptions. Don't ever do this! try{ int i = 0; while(true) a[i++].f(); }catch(ArrayIndexOutOfBoundException e){ } 通过用抛出(throw).捕获(catch).忽略ArrayIndexOu…