...util工具包解析(五)——UUID、Base64、内置观察。。。

...util工具包解析(五)——UUID、Base64、内置观察。。。

2023年7月9日发(作者:)

Java源码分析——⼯具包解析(五)——UUID、Base64、内置观察。。。UUID 关于UUID,我们需要知道它最重要的⼀点,就是它会⽣成全地球唯⼀的⼀个id,它可以作为数据库的主键存在,标识各个元组。 UUID保证对在同⼀时空中的所有机器都是唯⼀的,利⽤机器的当前⽇期和时间、时钟序列、全局唯⼀的IEEE机器识别号来⽣成唯⼀的⼀个id。其⽤法如下://得到⼀个n(UUID());Base64 Base64类是将不是ASCII码的字符串转换为ASCII码格式的,可以做到简单的将密码的明⽂转变为⾮明⽂,但不能做到保密,⼀般⽤在⽹络传输上,需要ASCII码的地⽅,⽤法如下: //编码 String asB64 = oder().encodeToString("蕾姆".getBytes("utf-8")); n(asB64); //

输出为: c29tZSBzdHJpbmc= //

解码 byte[] asBytes = oder().decode("6JW+5aeG"); //输出:6JW+5aeG //蕾姆Observer Observer类是Java内置的观察者模式,⽤⼀张图来说明下观察者模式: 对观察者模式举个例⼦的话,就像微信的推送消息,每个微信的使⽤者都是观察者,公众号就是⼀个被观察者,当公众号有消息更新后,会同步通知每个观察者说我要进⾏消息的推送了,然后将消息推送给每个观察者。可以理解为⼴播模式,被观察者通过⼴播通知各个观察者。在Java中,定义了⼀个Observer接⼝,定义了消息的更新操作:public interface Observer { void update(Observable o, Object arg);} 接着是被观察者:public class Observable { //changed表⽰是否需要更新 private boolean changed = false; //存贮观察者 private Vector obs; public Observable() { obs = new Vector<>(); } //增加⼀个观察者 public synchronized void addObserver(Observer o) { if (o == null) throw new NullPointerException(); if (!ns(o)) { ment(o); } } //删除⼀个观察者 public synchronized void deleteObserver(Observer o) { Element(o); } //通知所有观察者 public void notifyObservers() { notifyObservers(null); } //通知所有的观察者 public void notifyObservers(Object arg) { Object[] arrLocal; synchronized (this) { if (!changed) return; arrLocal = y(); clearChanged(); } for (int i = -1; i>=0; i--) ((Observer)arrLocal[i]).update(this, arg); } //删除所有的观察者 public synchronized void deleteObservers() { AllElements(); } //表明可以进⾏更新 protected synchronized void setChanged() { changed = true; } //更新完设置不可更新 protected synchronized void clearChanged() { changed = false; } //返回是否更新 public synchronized boolean hasChanged() { return changed; } //观察者的数量 public synchronized int countObservers() { return (); }} 从源码中看出,该类是个同步类,线程安全,每次更新完都会设置不可更新。如何⽤这两个类实现⼀个观察者模式呢?⾸先,先定义观察者类实现Observer接⼝,我在这定义了DateUpdateObserver数据更新以及ViewUpdateObserver视图更新:public class ViewUpdateObserver implements Observer { @Override public void update(Observable o, Object arg) { n("视图改变了"); }}public class DateUpdateObserver implements Observer { @Override public void update(Observable o, Object arg) { n("数据改变了"); }} 接着实现被观察者继承Observable 类,因为设置可以更新的⽅法是保护⽅法,所以必须继承Observable 类来设置可以更新的值,,我这⾥为了简便直接在构造器⾥⾯设置了:public class ShowUpdate extends Observable { public ShowUpdate(){ setChanged(); }} 测试:Observable observable=new ShowUpdate();erver(new DateUpdateObserver());erver(new ViewUpdateObserver());Observers();//输出:视图改变了

数据改变了EventListener、RandomAccess 关于这两个接⼝,阅读过它两源码的同学都知道,它们都是空的接⼝,没有定义任何东西,是起标记⽤的:public interface RandomAccess {}public interface EventListener {} 先说RandomAccess接⼝,该接⼝是⼀个标记为随机访问的接⼝,是什么意思呢?RandomAccess接⼝被ArrayList、Vector实现过,是让它判断是否是数组类型的容器的,因为只有数组类型的容器可以⽤下标来实现随机的访问。这⼀点⽤到了Collections容器的选择查找对应值的索引上:public static int binarySearch(List> list, T key) { if (list instanceof RandomAccess || ()

发布者:admin,转转请注明出处:http://www.yc00.com/xiaochengxu/1688882198a180543.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信