EffectiveJava学习笔记12:接口只用于定义类型、尽量以类层次代替标签类

1.接口只用于定义类型

1.1 什么是接口用于定义类型?

书中这个标题一开始让我费解,只用于定义类型是什么鬼?然后看了书,我决定自己总结概括一下。

书中有这么一句话:当类实现接口时,接口就充当可以引用这个类的实例的类型

总结意思就是:当一个类中使用接口,来重写实现接口里的方法时,相当于接口是这个类的实例化后的一部分,所以是这个类的类型。就是类实现了接口,然后就能通过实行的接口方法,对实例进行增删改查之类的操作(其实接口主要作用都清楚,这样的定义实在有点鸡肋)

1.2 什么是常量接口?

常量接口就是只包含静态的final域,每个域导出一个常量的接口

(PS:域是什么?请看https://blog.csdn.net/asdfghj253/article/details/103287506

总结就是:常量接口就是接口只有常量,没有方法的接口。

注意:常量接口是对接口的不良使用,要定义常量的话,不应该写在接口中,应该写在具体的类中。

所以接口应只被用来定义类型,不应该被用来导出常量

 

2.尽量以类层次代替标签类

2.1 什么是标签类?

这里我吐槽一点,本来想网上搜下标签类是什么?想看别人是怎么理解的,结果没一个找到的,全是照搬的。。。所以我还是老实看书自我总结吧。

书中的定义是:带有两种甚至更多种风格的实例的类,并包含表示实例风格的标签域。

自我总结:很简单,就是能有多种表现形式的类(比如:一个类实例化出来可以是圆形,可以是矩形,可以三角形)。

public class Figure{
    enum Shape {
        RECTANGLE,
        CIRCLE
    }
     
    // Tag field - the shape of this figure
    final Shape shape;
     
    // These field are use only if shape if RECTANGLE
    double length;
    double width;
     
    // This field is use only if shape is CIRCLE
    double radius;
     
    // Constructor for circle
    public Figure(double radius) {
        shape = Shape.CIRCLE;
        this.radius = radius;
    }
     
    // Constructor for rectangle
    public Figure(double length, double width) {
        shape = Shape.RECTANGLE;
        this.length = length;
        this.width = width;
    }
     
    double area() {
        switch (shape) {
        case RECTANGLE:
            return length * width;
        case CIRCLE:
            return Math.PI * (radius * radius);
        default:
            throw new AssertionError();
        }
    }
}

这是书中标签类案例的代码,你可以发现:这个类创建调用构造器时有两种选择,一种是圆形的实现方法,一种是矩形的实现方法也就是说  一类多用的类=标签类。

 

2.2 类层次是什么?

类层次:在我的理解中很简单,就是多个类,形成父类子类之分,也就是书中提到的子类型化。

用类层次代替标签类的原因:标签类把东西都塞在一个类中,那个这个类就过于臃肿难看了

对比上面的标签类代码,书中也提供了相同实现的类层次的类的编写。

abstract class Figure {
    abstract double area();
}
 
class Circle extends Figure {
    final double radius;
     
    Circle(double radius) {
        this.radius = radius;
    }
     
    double area() {
        return Math.PI * (radius * radius);
    }
}
 
class Rectangle extends Figure {
    final double length;
    final double width;
     
    Rectangle(double length, double width) {
        this.length = length;
        this.width = width;
    }
    double area() {
        return length * width;
    }
}

相比较之前的标签类代码:

这边把一个类拆分为了三个类:一个父类,两个子类(一个子类类实现圆形,另一个子类实现矩形)

相比较而言,是不是更简洁明了了呢!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值