请看我们的资料:4000G Java设计师资料。(如有必要,请关注留言。)
主要内容:21 Java高级类体系结构类:java8的新功能、P2P金融项目、编程、功能设计、数据库设计、体系结构设计、Web安全、高并发、高性能、高可用性、高度可扩展的分布式、群集、电子商务全文搜索、SPRT.Android、hbase、微信小程序移动应用程序、2017年最热门的数据(Hadoop、)
获取方法:注意标题信息。
接着在上一期继续阅读这本书高质量编码建议的17~22个阅读笔记。
17.为继承而设计,提供文档说明或禁止使用继承
不要过分设计。
面向对象的编程,一开始被洗脑的时候,首先要记下是否有公共方法,能否将两个类抽象成一个超类,慎重使用继承,使用继承的时候一定要在文档注释中重写这个方法,对其他方法会有什么影响。抽象类可能有实现方法,也可能没有。
接口方法的默认修饰符为public,不能使用其他修饰符。抽象类可以具有public、protected和default。
Java只支持单个继承,但可以实现多个接口,因此返回到“接口比抽象类好”的问题。在有抽象类的地方,基本上可以看到其中很多方法都是模板方法。
19.界面仅用于定义类型
在本主题中,建议不要只定义常数,使其成为常数接口。如果类中只有常量,则必须使用枚举类型或不能实例化的工具类。JDK的反例是java.io.ObjectStreamConstant。
类层次结构优先于标签类
标签类是在类中定义的变量,使用该变量的值控制要执行的操作。
书的示例:使用Shapre变量定义可以传递“矩形”或“圆形”的Figure类,并根据接收类型调用常用方法。这是标签类。如果添加“三角形”,则必须修改此标签类的代码。
更好的方法是利用继承,合理利用继承可以更好地表达面向对象的多态。
21.使用函数对象显示策略
什么是函数对象?实际上,在JDK8之前,Java不支持lamda表达式。方法参数为Arrays.sort(T[] a,Comparator?Super T c)方法,第一个参数会传递阵列,并根据传递给第二个自订比较类别的比较方法进行排序。如果可以传递函数指针、LAMDA表达式等,则不需要传递类。
从JDK8开始,Java已经支持lambda表达式。请简要查看JDK8的lambda表达式。
从广义上讲,JDK8的lambad表达式有两个组成部分。一个是LAMBAD表达式本身,另一个是函数接口。函数型接口实际上是只包含一种抽象方法的接口。例如,Runnable接口仅包含run抽象方法。Lambda表达式本身实际上是抽象方法的实现。
首先,lambda表达式的语法格式如下:
比如说,
(n)-Sy(n);
表示打印n。
前面提到的兰巴德是抽象方法的体现。那么实际上,这个Lamba表达式如下。
:public void demo(String n){
Sy(n);
}
lambda表达式不过是一个匿名方法实现而已,接下来我们看看到底是如何使用lambda表达式。
/**
* 函数式接口,只包含一个抽象方法
*/
public interface LambdaDemo {
void demo(String n);
}
/**
* lambda例子
*/
public class App {
public static void main( String[] args ) {
LambdaDemo lambdaDemo = (n) -> Sy(n); //实例化LambdaDemo类,同时也lambda表达式实现了demo方法
lambdaDemo.demo("hello lambda");
}
}
22.优先使用静态成员类
一般情况下我们可能提到最多的是“内部类”这个名词,实际上在类“内部”的类叫做“嵌套类”。嵌套类分为四种:静态成员类、非静态成员类、匿名类和局部类。除了静态成员类,其余三种才被称之为内部类。
匿名类提及的比较多:
public class App {
public static void main( String[] args ) {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
Sy("这是一个内部类");
}
}); //回顾一下lambda表达式,可表示为Thread thread = new Thread(() -> Sy("这是一个内部类"));
();
}
}
静态成员类相比较于非静态成员类就是多了一个static关键字修饰类,另外一个更重要的区别在于非静态成员类的每个实例都包含一个额外的指向外围对象的引用,保存这份引用要耗费时间和空间。
举个例子,在JDK7中,HashMap内部使用Entry类表示每个键-值对,这个类是static静态的,如果将static去掉仍然可以工作,但每个entry中将会包含一个指向该Map的引用,这样就浪费了空间和时间。
那么什么时候使用静态什么时候使用非静态呢?
书中给出了比较明确的原则:如果声明成员类不要求访问外围实例,就要始终把static修饰符放在它的声明中。也就是说如果成员类和外围实例类有交互,那这个类就应该是非静态的,如果没有交互而是作为外围类的一个组件存在在应使用静态的。
最后一个是局部类,只要是在任何“可以声明局部变量的地方”,都可以声明局部类,用得最少,如果要使用那也必须非常简短。
今天就这么多了,明天持续更新,下期内容:
23.请不要在新代码中使用原生态类型
24.消除非受检警告
25.列表优先于数组
获取方式:关注头条号留言即可