15036188778

您所在位置: 首页> 学习课程> java培训学校 | Java编程几个常见误区,你进入了吗?

java培训学校 | Java编程几个常见误区,你进入了吗?

发布百知教育 来源:学习课程 2019-10-21

谈一谈中间件开发中的误区:


Map或许是一种数据结构,但是JAVA&C之类语言里,Map是一个类,包含了一种数据结构,更包括了对应的方法,比如最简单的 get/put,即读取/添加元素的方法。


这就是为什么对于一些RPC组件,序列化结果的时候,A可以直接传输一个 Map类型的结果给B,而B可以正常反序列化这个Map并使用,[比如A和B都是JVM上编程时,他们就使用JVM包含的 Map.class这个JAVA类,对于JAVA到Go同理]不考虑序列化载体支持Map结构外。

但假设你自定义了一个类,这个类含数据结构和相应的操作方法,那么你使用方就需要这个类和方法去操作反序列化后的对象,否则他可能只是拿到了反序列化后的数据(而不能做任何操作)


1, 许多人都知道kafka是 partition 严格有序的,所以比如:


 1) kafka分区严格有序

 2) kafka 消息有序

 3) 如果是根据uid作为分区键,则uid维度消息是有序的

大多数人可能知道赞同1、3,认为2说法不对。


但实际上,3也是不对的,partition 严格有序并不能保证消息有序。

首先消息有序至少分为发送/接收有序,当partition shrink或partition扩张的时候,比如从32 partition故障28再恢复到32时,这个时候按uid维度有序,

也即中间hash基数有变化,出现同uid在不同partition情况,那么消费就不能保证有序的。


2、kafka producer有个配置 acks=0,1,all,很多人看官方文档,认为acks=all 即表示所有副本都确认写入成功才算。


但其实不是,它的意思在当前同步中副本(ISR)都确认写入成功后,才认为写入成功。

比如:当topic被设置为2副本,但当一个节点挂掉时,,此时acks=all 的写操作也会成功。除非剩下的副本节点也挂了,才会丢消息。


3、计算机本身可能是有0/1二进制组成的,但是计算机思维(设计架构编程语言)并不是,人类的语言/思维方式就更不是0/1了。


问题是,很多人人云亦云的 附和 “null sucks” 有道理吗?


Doug Lea说过 null sucks,但这并未影响Java取消null,新JDK也并未严格执行去null。可以说,讨论是否null并不简单,虽然比如不该在map存储null,null导致NPE带来代码丑陋,Guava就采用快速失败避免null,至于是否优雅,见仁见智。而采用Optional其实也可以算是一种对象化的null。


比如,编程语言首先是一个符号系统,比如,boolean a;表示布尔型变量,通常认为是false/true,人类思维支持/反对/中立,计算机系统,需要有 未赋值 这么个状态,虽然底层表示只有true/false。


并且,不是所有时候给予一个默认值都是正确的,正如对于i 银行账户,计算机表示你欠我多少钱的时候,在某个系统状态时,double a,不论是a是正数负数或者0,给予a一个默认值,这其实在某些运算时可能是危险的。


总之,这里谈的null是一种状态,理念,null sucks 并不表示 null 这个概念不对,而是java 实现null的方式不够完美。



java培训学校:http://www.baizhiedu.com/java2019





上一篇:java培训学校 | Java常用类库-CharSequence、AutoCloseble

下一篇:应届生去公司找个Java程序员的职位需要什么技能?

相关推荐

www.baizhiedu.com

有位老师想和您聊一聊

关闭

立即申请