自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

简单用心品质生活

关注高并发、高性能服务器开发

  • 博客(25)
  • 问答 (1)
  • 收藏
  • 关注

原创 【Effective Java】条39:必要时使用保护性拷贝

保护性拷贝大家都知道,相比于C或者C++,Java是一门安全性的语言。但这不意味着在编程时你可以随意为之,相反,你也不得不尽最大考虑客户端代码在尽力破坏你的不可变变量等,你也必须保护性的来设计自己的程序。如:public final class PeriodV1 { private final Date start; private final Date end; pu...

2018-05-25 15:20:16 260

原创 【Effective Java】条34:使用接口模拟扩展枚举

假设某需求,有个计算器实现了加、减、乘、除的算法,但是希望同时也允许客户端自定义某些操作方法。计算器实现的加、减、乘、除代码如下:public enum Operation { PLUS("+") { @Override double apply(double x, double y) { return x + y; } }, MINU...

2018-05-23 15:59:38 704 1

原创 【Effective Java】条30:使用枚举代替int常量

在枚举类型出现之前,一般都常常使用int常量或者String常量表示列举相关事物。如: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 in...

2018-05-23 09:14:46 738

原创 【Effective Java】条25:列表优先于数组

数组和列表有两个很大的不同: 1. 数组是协变,列表是不变的。意思是当类A是类B的子类时,则A[]是B[]的子类;而对于列表,对于任何两个不同的类型Type1和Type2,都不会存在List<Type1>是List<Type2>的子类或者父类。数组类型是具体的,即数组明确知道元素的类型并强制在运行时确定元素的类型;列表是擦除的,所以在编译的时候就会明确要求类型统一。...

2018-05-18 16:12:52 356

原创 【Effective Java】条23-24:不要使用原生态类型-消除检测的代码警告

在使用泛型的时候,禁止直接声明为原生态类型。如:List list = new ArrayList();而应该直接指定具体的参数类型,如:List<String> list = new ArrayList();如果真的不能确定具体的参数类型,那可以使用无限制的通配符类型:List<?> list = new ArrayList();主要原...

2018-05-17 17:20:14 194

原创 【Effective Java】条22:静态成员类优于非静态成员类

嵌套类是指定义在其他类里面的类,其旨在为外围类提供服务。嵌套类有四种,分别为静态成员类、非静态成员类、匿名类和局部类,其中非静态成员类、匿名类和局部类又称为内部类。静态成员类静态成员类是最简单的嵌套类。静态成员类是外围类的静态成员,且和其他静态成员一样遵守相同的访问规则。注意静态成员类只能访问外围类的静态成员。使用方法如下Demo所示:public class StaticMe...

2018-05-17 16:47:18 457

原创 【Effective Java】条21:使用函数对象代表策略

一些编程语言通过提供函数指针、委托、lambda表达式或者其他类似的方式,来使得程序拥有存储、并传递特殊函数的能力。Java没有提供函数指针,但是对象引用能提供相同的效果,另Java 1.8开始,提供了lambda表达式。例如,针对字符串的比较,假设我们定义一个比较:class StringLengthCompare { public int compare(String s1...

2018-05-17 10:56:09 267

原创 【Effective Java】条20:类层次优于标签类

标签类,这里指类依据本身的某个属性,来确定类会产生不同的对象。很明显,这不符合类的单一职责原则。如:public class Figure { enum Shape { RECTANGLE, CIRCLE } private Shape shape; /** rectangle fields*/ private double length; priva...

2018-05-16 09:48:19 404

原创 【Effective Java】条18:接口优先于抽象类

Java程序提供两种机制来允许定义多个实现的类型:接口和抽象类。接口和抽象类区别1在于抽象类可以包含某些方法的实现,但是接口却不允许;但最明显的区别还是在于若一旦继承于抽象类,那该类就是抽象类的子类,继承所带来的缺点也就随即而来,譬如Java只允许单继承。接口优先于抽象类优点已存在的类可以通过实现新接口来轻易的改造接口类型相当于行为的抽象,对于一扇门来说打开(open())、关闭...

2018-05-15 17:34:59 435

转载 深入理解Java的接口和抽象类

本文转载自深入理解Java的接口和抽象类抽象类在了解抽象类之前,先来了解一下抽象方法。抽象方法是一种特殊的方法:它只有声明,而没有具体的实现。抽象方法的声明格式为:abstract void fun();抽象方法必须用abstract关键字进行修饰。如果一个类含有抽象方法,则称这个类为抽象类,抽象类必须在类前用abstract关键字修饰。因为抽象类中含有无具体实现的方法,所以不能用...

2018-05-15 15:16:04 155

原创 【Effective Java】条17:为继承类专门设计并提供文档说明,否则不使用

在【Effective Java】条16:复合优于继承中我们已经提到过使用继承的缺点。但如果是专为继承设计的,并提供文档说明,那是排除在外的情形。下面看看怎么专为继承设计类,并怎么提供文档说明。该类的文档需明确说明重写任何方法的影响 对于每个public或者protected的方法或者构造器,都需要指明该方法或者构造器调用了哪些可覆盖的方法,以什么顺序,每个调用结果是如何影响后续的处理。最...

2018-05-15 10:27:16 148

原创 【Effective Java】条16:复合优于继承

本文所说的继承都是类和类之间的继承,而非接口和类之间的继承继承是面向对象的三大特性之一。一般情况下,当子类和父类在同一包下且必须继承的时候可以采用继承,毕竟同一包下的代码由同一个人管理;另外当某个类就是被设计成去继承的时候,也可以考虑继承。但是继承如果使用不当的话,会导致随后软件修改很困难。假设我们需要实现Set中曾经加入过多少次元素。实现如下:public class...

2018-05-15 09:23:29 372

原创 【Effective Java】条15:最小化可变性

不可变类从其开始被创建,至其生命周期结束,其状态都是不可变的。Java类库中也提供了许多不可变类,如String、BigInteger、BigDecimal等。创建不可变类为了创建不可变类,可遵循以下5条规则: 1. 为类的域不提供修改对象状态的方法,通常就是setter方法; 2. 类不可被继承类不可被继承有两种实现方式。一为类用`final`修饰,表示不可被继承;二为类不提...

2018-05-09 14:03:53 302

原创 【Effective Java】条14:共有类中使用访问方法而不是公有域

在平时开发中,也会你会定义某些类,没什么作用,仅仅是集中一些实例域的。如:class Point { public float x; public float y;}由于类设计成这样,可以直接通过对象访问,简洁了很多。但是这不符合面向对象的思想,万一x的计算方式有更改,该怎么办?所以最好我们为实例域提供访问方法,如:class Point { pr...

2018-05-08 17:14:10 280

原创 【Effective Java】条13:使类和成员可访问性最小

区分程序设计的好坏之一就是看模块之间实现细节的隐藏。这其实就是信息隐藏或者称之为封装,是软件设计的基本原则之一。成员访问级别在Java程序设计准则中,第一规则就是尽可能地使每个类或者成员不被外界访问,即访问级别尽量小。在Java中,对于成员(域、方法、嵌套类和嵌套接口)有四种可能的访问级别。按可访问性递增排序如下: 1. private只能在声明此成员的类中才能访问2....

2018-05-08 16:46:46 281

原创 【Effective Java】条6:消除过期对象引用

当你从内存需要管理的语言(C、C++),跳转到基于GC管理内存的语言时,你会发现要简单很多。因为GC会自动回收不可用对象,它释放了你的工作。但是GC管理内存一定可靠吗?答案是未必。如:public class Stack { private Object[] elements; private int size = 0; private static final...

2018-05-04 22:06:53 292

原创 【Effective Java】条5:避免创建不必要的对象

在代码Review的时候,也许你老大会告诉你,字符串创建要放到循环之外。for(int i = 0; i < length; i++) { String s = new String(i);}为什么呢?因为在循环的时候,创建了太多的临时对象。每一次循环,都需要new String(),并赋值给新的对象s。我们可以作如下改进:String s;for(int...

2018-05-04 16:57:00 161

原创 【Effective Java】条4:通过私有构造器强化不可实例化

在日常开发中,我们经常会写些工具类(虽然名声不是很好)。为了防止调用者不明白进行了实例化调用,我们可以在工具类中添加私有的构造函数。public class UtilityClass { // Suppress default constructor for noninstantiability private UtilityClass() { } ... ...

2018-05-04 14:58:20 784

原创 【Effective Java】条3:用私有构造器或枚举类型强化singleton属性

Singleton修饰的对象指在系统中是唯一的。Singleton的实现公有域方法public class SingletonTestOne { public static final SingletonTestOne INSTANCE = new SingletonTestOne(); private SingletonTestOne() { ...

2018-05-04 11:35:56 148

原创 【Effective Java】条2:多构造器参数考虑用构造器

构造函数和静态工厂方法1都不能很好的处理多参数问题。譬如有一个类表示包装食品外面显示的营养成分标签,这些标签包含必须的成分:每份的含量,每罐的含量以及每份的卡路里,还有一些其他非必须的显示,譬如总脂肪量、饱和脂肪量、转化脂肪、胆固醇、钠等等。public class NutritionFacts { /** 必须参数*/ private int servingSize; ...

2018-05-04 10:44:04 151

原创 Java必备的Intellij插件推荐(长期更新)

工欲善其事,必先利其器lombok 可以省略需要手写的Getter & Setter方法Builder Generator 快速生成构造器模式代码GsonFormat 快速将JSON字符串转为类Alibaba Java Coding Guidelines 统一组内开发规范FindBugs-IDEA 帮助你发现隐藏BUGSonarLint 帮助你发现隐藏BUG,针...

2018-05-04 10:38:18 3307

原创 【Effective Java】条1:考虑用静态工厂方法代替构造器

在日常编程中,获取类的实例通常采用构造器的方法。还有另一种方法叫作“静态工厂方法(Static Factory Method)”。譬如Boolean类中这段代码:public static Boolean valueOf(boolean b) { return (b ? TRUE : FALSE);}使用静态工厂方法优点静态工厂方法有名称构造函数的方法名比较单调...

2018-05-03 18:09:34 147

原创 【Effective Java】条12:考虑实现Comparable

如果自实现的类涉及到内在排序,譬如按字母排序或数字排序或日期排序的,强烈建议实现Comparable接口。实现了Comparable接口的类,可以和许多的泛型算法以及集合进行协作。譬如,列表或数组中的元素实现了Comparable接口,则排序时可以直接调用Collections.sort(list)或Arrays.sort(array)得到结果。通用约定JDK8文档1中这样描述Co...

2018-05-03 11:21:57 131

原创 【Effective Java】条11:谨慎覆盖clone方法

Object文档中指出对象需要被clone,则需要实现Cloneable接口。Cloneable接口只是个标记,没有任何方法。clone约定对于任何对象x, - x.clone() != x返回为true - x.clone().getClass() == x.getClass()返回为true - x.clone().equals(x)返回为true但是约定同时指出,...

2018-05-02 18:03:51 287

原创 【Effective Java】条9:重写equals方法时必须重写hashCode 方法

必须谨记:对于每一个类,重写equals方法时,必须重写hashCode方法。如果没有遵照此规定,则在所有基于hash计算的类中(如:HashMap、HashSet和HashTable)都会出问题。hashCode约定Object规范中有这样的约定:在程序相同执行过程中多次调用同个对象,哈希值必须返回相同。但不是相同调用过程则不必相同; 如果两个对象调用equals()方法相同...

2018-05-02 10:52:55 225

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除