java final修饰成员变量赋值的二种方法

这几天一直在看universalimageloader加载图片的开源框架源码,发现里面涉及到了很多不太懂或者遗忘的java一些基础,比如今天这篇博客讲的final修饰成员变量,

先看下代码:

DisplayImageOptions.java 图片显示的配置项。比如加载前、加载中、加载失败应该显示的占位图片,图片是否需要在磁盘缓存,是否需要在 memory 缓存等

看几个它里面的定义的成员变量;

private final int imageResOnLoading;//图片正在加载中的占位图片的 resource id,优先级比下面的 imageOnLoading 高,当存在时, imageOnLoading 不起作用
private final int imageResForEmptyUri;//空 uri 时的占位图片的 resource id,优先级比下面的 imageForEmptyUri 高,当存在时, imageForEmptyUri 不起作用
private final int imageResOnFail;//加载失败时的占位图片的 resource id,优先级比下面的 imageOnFail 高,当存在时, imageOnFail 不起作用
private final Drawable imageOnLoading;//加载中的占位图片的 drawabled 对象,默认为 null。
private final Drawable imageForEmptyUri;//空 uri 时的占位图片的 drawabled 对象,默认为 null。
private final Drawable imageOnFail;//加载失败时的占位图片的 drawabled 对象,默认为 null。

如果你想通过什么setXxxx()方法来进行赋值的话,恭喜你,编译器给你报一个错:

The blank final field a may not have been initialized,这是说我们在定义初始化变量的时候没有初始化,所以要么在定义变量的时候就赋值,还有就是在构造函数中赋值,接着上面的类继续讲;它的构造函数是这样的

private DisplayImageOptions(Builder builder) {
 imageResOnLoading = builder.imageResOnLoading;
 imageResForEmptyUri = builder.imageResForEmptyUri;

   }

发现构造函数中传递了一个Builder类,

public static class Builder {
 private int imageResOnLoading = 0;
 private int imageResForEmptyUri = 0;

 }

到这里你想到了什么,是不是很像一个设计模式,对,就是使用了生产器模式,现在看下它是怎么使用:

DisplayImageOptions imageOptions = new DisplayImageOptions.Builder()
.cacheInMemory(true).cacheOnDisk(true)
.resetViewBeforeLoading(true).considerExifParams(false)
.bitmapConfig(Bitmap.Config.RGB_565).build();

在这里可以对DisplayImageOptions类中的成员变量进行赋值,这样对DisplayImageOptions类中的变量一旦赋值就不能修改,这就使用到了设计中的一个原则:开闭原则,

什么是开闭原则:随便在网上一找都可以找到相关的概念,但是光知道概念对学技术的人来说是远远不够的,如果通过代码知道反过来去理解概念就容易多了,

一个软件实体应当对扩展开放,对修改关闭。即软件实体应尽量在不修改原有代码的情况下进行扩展,

上面就是相关的概念,想想我们DisplayImageOptions类,你能去修改它的变量么,不能修改,因为它是final修饰的,这段时间一直在看这个框架源码,感觉看好的框架源码,学到的东西真不少!要回家了,公司就只有我一个人 ,不然打不上车了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值