effective java
左耳听风
公众号:左耳代码
展开
-
【effective java】38~44.方法
第38条:检查参数的有效性当编写方法或者构造方法的时候,应该考虑它的参数有哪些限制,应该把这些限制写到文档中,并且在这个方法的开头处,通过显示的检查来实施这些限制.养成这个习惯是非常必要的.第39条:必要时进行保护性拷贝如果类具有从客户端得到或者返回客户端的可变组件,类就必须保护性地拷贝这些组件,如果拷贝成本受到限制,并且类信任调用者不会修改内部组件,不进行保护性拷贝也是可以的,类的文...原创 2018-07-17 16:28:48 · 207 阅读 · 0 评论 -
【effective java】66~73.并发
第66条:同步访问共享的可变数据private static boolean stopRequested;public static void main(String[] args) throws InterruptedException {Thread backgroundThread = new Thread(new Runnable() {@Overridepubl...原创 2018-08-05 17:55:03 · 252 阅读 · 0 评论 -
【effective java】57~65.异常
第57条:只针对异常的条件才使用异常异常是为了在异常情况下使用而设计的。不要将他们用于普通的控制流,也不要编写迫使他们这么做的API。如何正确的使用异常:https://www.aliyun.com/jiaocheng/550636.html 第58条:对可恢复的条件使用受检异常,对编程错误使用运行时异常java提供了三种可以抛出的结构:1. 受检异常(checked ex...原创 2018-08-05 10:50:13 · 226 阅读 · 0 评论 -
【effective java】49.基本类型优先于装箱的基本类型
在基本类型和装箱基本类型中有3个主要区别:1、基本类型只有值,装箱基本类型具有与它们的值不同的统一性;2、基本类型只有功能完备的值,而每个装箱基本类型除了它对应基本类型的所有功能值外,还有个非功能值–null;3、基本类型比装箱基本类型更节省时间和空间。 /** * 如果first和second引用表示同一个int值得不同Integer实例,这个比较操作会返回false...原创 2018-08-05 10:48:46 · 210 阅读 · 0 评论 -
【effective java】48.如果需要精确的答案,请避免使用float和double
float和double主要为了科学计算和工程计算而设计,执行二进制浮点运算,这是为了在广泛的数值范围上提供较为精确的快速近似计算而精心设计的。然而,它们没有提供完全精确的结果,所以不适合用于需要精确结果的场合,尤其是货币计算。public static void main(String[] args) { //假设有1.03元,花掉0.42元后 System.out.pri...原创 2018-08-05 10:48:18 · 365 阅读 · 0 评论 -
【effective java】45~56.通用程序设计
第45条:将局部变量的作用域最小化1)在第一次使用某个局部变量的地方进行声明。不然可能出现变量未初始化等问题2)几乎每个局部变量的声明都应该包含一个初始化表达式。3)for循环,都允许声明循环变量,它们的总用域被限定在正好需要的范围之内。4)使用另一个局部变量来限制一个局部变量的迭代范围。5)使方法小而集中。就是一个方法尽量实现一个功能,两个功能合在一个方法里面会出现变量混用第46条...原创 2018-08-05 10:47:37 · 218 阅读 · 0 评论 -
【effective java】23~29.泛型
23.请不要在新代码中使用原生态类型a)简介(1)泛型(generic):声明中具有一个或者多个类型参数(type parameter)的类或者接口,就是泛型类或者接口(2)参数化类型(parameterized type):例如,List<String>(读作“list of string”)是一个参数化的类型,表示元素类型为String的列表(3)原生态类型(raw type):不...原创 2018-07-15 09:28:27 · 235 阅读 · 0 评论 -
【effective java】13~22.类和接口
第13条:使类和成员的可访问性最小化Java通过封装和修饰符等手段限制访问权限,尽量降低类的可访问性,可以降低风险,应成员变量和成员方法的访问权限降低,尤其是成员变量,尽量使用private修饰,如果不是很有必要,不要使用成员变量,成员变量在并发条件下容易引发线程安全问题,为了防止出现这种问题,使用同步等方式会增加开销。第14条:在公有类中使用访问方法而非公有域尽量使用getter()/sette...原创 2018-07-13 16:32:29 · 190 阅读 · 0 评论 -
effective java 读书笔记
第一章 引言全书78条原则,大致包含了并发,设计模式,多态,类库,异常,序列化等相关知识,从安全,高效,性能,扩展,可读性,这几个方面讲述了 How to use Java efficiently ?事例源码:点击打开看完之后觉得自己之前的编码水平太low了,写代码没有章法,没有套路,不易维护,隐藏着很多问题 第2章 创建和销毁对象第1条:考虑用静态工厂方法代替构造器...原创 2018-07-07 08:30:04 · 240 阅读 · 0 评论 -
【effective java】7.避免使用终结方法
1.whata)所谓的终结方法其实是指finalize()。b)Java的垃圾回收机制只负责内存相关清理,其他资源的清理(释放文件、释放DB连接)需要程序员手动完成。c)调用System.gc() 只是建议JVM执行垃圾回收(GC),但什么时候执行、是否要执行由JVM决定。d)用户可以自己调用对象的finalize方法,但是这种调用是正常的方法调用,和对象的销毁过程无关。e)如果一个类实现了fin...原创 2018-07-07 08:27:56 · 267 阅读 · 0 评论 -
【effective java】6.消除过期的对象引用
1.whyJava的垃圾回收机制并不代表我们不需要考虑内存管理的问题。a)一般来说,只要类开辟了一段内存空间,并且一直持有这段空间的引用,那就要管理它了b)缓存,设置缓存之后如果没用到的话也需要移除c)监听器与回调,查看 class MainActivity extends AppCompatActivity implements OnNetworkChangedListener如果MainAct...原创 2018-07-07 08:27:06 · 248 阅读 · 0 评论 -
【effective java】5.避免创建不必要的对象
1.why可以重用的对象局没必要在实例化了demo1:String s = new String("hello world");需要改成String s = "hello world";因为第一种写法,每一次调用的时候都会创建一个新的String实例。但是第二种写法,在同一台虚拟机中运行的代码,只要他们包含相同的字符串字面常量,就会被重用。2.howcode:https://gitee.com/c...原创 2018-07-07 08:26:34 · 267 阅读 · 0 评论 -
【effective java】4.通过私有构造器强化不可实例化的能力
1.why我们很多工具类实际上是不需要被实例化的2.howcode:https://gitee.com/charjay/effective.git构造器私有避免被new出来构造器里面实现throw new AssertionError();避免被子类继承...原创 2018-07-07 08:26:00 · 255 阅读 · 0 评论 -
【effective java】3.用私有构造器或者枚举类型强化Singleton属性
1.why单例实现1:final的静态成员变量单例实现2:静态工厂方法以上两种不能保证全局只有一个对象,因为可以通过反射或者序列化破坏它们(1)通过反射构造出对象```Constructor<?> constructor = Elvis.class.getDeclaredConstructors()[0];constructor.setAccessible(true);Elvis in...原创 2018-07-07 08:25:33 · 230 阅读 · 0 评论 -
【effective java】2.遇到多个构造器参数时要考虑用构建器
1.whya)目前我们学习了构建一个对象有三种实现方式,1是构造器,2是静态工厂,3是java bean模式(1)构造器的缺点是如果对象每新增一个成员变量,那么对应构造器就要加一个参数或者重叠构造器,而当我们使用构造器实例化对象的时候还要仔细对一下参数,避免传错,这样就的代码不容易阅读和开发。(2)静态工程跟构造器一样,不能很好的支持扩展大量参数(3)java bean构造对象,实例化对象后通过s...原创 2018-07-06 23:35:36 · 169 阅读 · 0 评论 -
【effective java】1.考虑用静态工厂方法代替构造器
1.whya)有名称:假设有一个对象,这个对象有很多构造函数,并且构造函数返回内容不同,这时候如果没有文档就麻烦了,但是如果有个方法,这个方法有名称,跟明确的表示我是干嘛的,这时候就很容易记住了(如:BigInteger.probablePrime())b)不必每次都创建新对象适用于单例模式c)构成基于接口的框架静态工厂方法返回对象所属的类可以是后来动态添加的,这样在返回对象是就比较灵活(比如我们...原创 2018-07-06 23:34:28 · 296 阅读 · 0 评论 -
【effective java】8~12.对于所有对象都通用的方法
1.why书本介绍过于繁杂,下面我简单介绍使用(1)以hashSet开头介绍 hashCode与equals(hashCode是简单比较,equals是严谨比较)(2)TreeSet是排序加去重的集合,所以这里面的对象可以实现compareTo()接口来实现这个功能(3)toStrng() 使对象可读性增强(4)clone()查看原型模式 https://blog.csdn.net/charjay...原创 2018-07-12 13:20:01 · 212 阅读 · 0 评论 -
【effective java】30~37.枚举和注解
第30条:用enum代替int常量a)int常量的缺点public static final int APPLE_FUJI = 0;public static final int APPLE_PIPPIN = 1;public static final int APPLE_GRANNY_SMITH = 2;public static final int ORANGE_NAVEL =...原创 2018-07-17 16:29:49 · 218 阅读 · 0 评论 -
【effective java】74~78.序列化
第74条:谨慎地实现Serializable1)实现Serializable接口而付出的最大代价是,一旦一个类被发布,就大大降低了“改变这个类的实现”的灵活性。2)第二个代价是,它增加了出现Bug和安全漏洞的可能性。(会被反序列化)3)第三个代价是,随着类发行新的版本,相关的测试负担也增加了。(要测试序列化与反序列化是否正常)4)为了继承而设计的类应该尽可能少地去实现Seriali...原创 2018-08-05 17:55:57 · 315 阅读 · 0 评论