Java的协变,逆变与不变
Java 泛型
目录
Java 泛型
我们为什么需要泛型
自从Java SE 1.5引入泛型(Generics) 之前,Java程序员想要写出通用的代码有点难度。比如想要得到Java某个集合(Collection
)的最大值,在没有泛型的情况下,我们需要针对每个特定类型去写特定的求最大值方法。
比如针对Number
集合我们需要实现
1 | public static Number max(NumberCollection coll, NumberComparator comp) |
针对Integer
集合我们需要实现
1 | public static Integer max(IntegerCollection coll, IntegerComparator comp) |
显而易见,这样实现起来是非常没有效率的。我们需要为每个不同的类型实现重复的逻辑,重复在编程中是非常罪恶的。当然,为了减少重复,我们也可以有这样的实现
1 | public static Object max(ObjectCollection coll, ObjectComparator comp) |
因为Java所有的类都是Object
的子类。当然这样实现的坏处就是需要做对象转型(Casting)
1 | Integer maxInterger = (Integer) max(coll, comp) |
然而对象转型也是非常罪恶的,因为一旦错误地使用了对象转型,代码只有到运行阶段(runtime) 才会报错。所以我们要尽可能的避免对象转型。
而有了泛型以后,我们只需要实现
Design review 设计评审
文章目录
背景
几年前在实习时,我完全没有接触过设计评审。当时的团队采用Scrum开发过程。开发团队采取一个架构师(Architect)和三到四个开发者(Developers)的配置。为了保证开发速度,冲刺订单(Spring backlog)里的大多数任务(Ticket)都有架构师写的详细开发步骤。架构师在团队里负责了大多数的软件设计任务,开发者则专注于将架构师的想法实现。
参加工作后,由于开发领域,开发过程,甚至是公司文化都与我实习过的公司有很多不同。在此期间,我也接触到了相当多的设计文档和设计评审。
2019年,我在开发团队里承担的设计任务也越来越多,写过的设计文档有二三十个。参加的设计评审则是更多。一年下来,我对设计评审,这个软件开发中的一个流程,有了自己的一些看法,下面则是我对设计评审的一个小总结。
Git request-pull 和 Github pull request
目录
简短的介绍
request-pull
和 Pull Request
的名称如此相似,但是他们的功能是完全不同的。
request-pull
是git的命令,它用于生成发送到邮件列表的待处理的更改的摘要。默认情况下,GitHub没有集成这个功能。
Pull Request
是GitHub特有的一项功能(简称PR)。它用于向Github托管的某一项目中的某一分支提出合并请求。项目管理者则可以在github的web界面上合并来自不同分支的代码,解决合并冲突,做代码审查或对代码进行评论。
Git request-pull
使用目的
Generates a summary of pending changes
生成待处理的更改的摘要
每个程序员都应该知道的延迟时间表
目录
翻译自:Latency Numbers Every Programmer Should Know
操作 | 延迟(纳秒) | 延迟(微秒) | 延迟(毫秒) | 参考 |
---|---|---|---|---|
CPU L1 级缓存访问 | 0.5 ns | |||
分支预测错误* | 5 ns | |||
CPU L2 级缓存访问 | 7 ns | 14x L1 cache | ||
互斥体Mutex 加锁/解锁 | 25 ns | |||
内存访问 | 100 ns | 20x L2 cache, 200x L1 cache | ||
用Zippy压缩1K字节 | 3,000 ns | 3 us | ||
在1 Gbps速率的网络上发送1K字节 over | 10,000 ns | 10 us | ||
从SSD读取4K长度的随机数据 | 150,000 ns | 150 us | ~1GB/sec SSD | |
从内存读取连续的1 MB长度数据 | 250,000 ns | 250 us | ||
在同一数据中心内的来回通讯延迟* | 500,000 ns | 500 us | ||
从SSD读取连续的1 MB长度数据 | 1,000,000 ns | 1,000 us | 1 ms | ~1GB/sec SSD, 4X memory |
磁盘寻址 | 10,000,000 ns | 10,000 us | 10 ms | 20x datacenter roundtrip |
从磁盘读取连续的1 MB长度数据 | 20,000,000 ns | 20,000 us | 20 ms | 80x memory, 20X SSD |
发送数据包 California->Netherlands->California | 150,000,000 ns | 150,000 us | 150 ms |