类型后置
swift和kt都选择了类型声明后置,java和dart则是前置类型
你说的类型推导,这个类型前置的时候也可以做到,比如java现在也有var的局部类型推导,你也可以在java里面用var s = "string";来定义一个局部变量
最近使用swift,dart这些的感觉,有这两个特性,是java可能永远都不会加上去的,但是kt有扩展函数,在不改动原有结构声明的前提下,扩展出新的方法,用这种方式可以在多层继承的时候,依次实现不同的protocol/interface这些
空安全,就是声明后面那个?,这样在编译时候可以帮你检查哪里不为空,这个主要是有breaking changes,会对原有代码造成影响,原来缺省的都是?,现在需要标记?,那么原来的代码都需要修改,dart准备在年底搞一个大的breaking change出来,就是空安全,这么大的改动,先不说有没有需求,就这么大的改动,java为了兼容性,是不太可能加进去的
除此之外,像gc这种,swift通过arc来实现类似效果,虽然需要用户手动标记,这个对于服务器端开发是不利的,一不小心漏过去,那就比较麻烦,相比之下java的gc不需要做任何标记,更无脑一点
其他的,比如aot,swift只能编译成native,没有jit模式,java等有,java现在也有aot了
从应用场景上看,swift更偏向客户端,gui什么都做得相对舒服,你想整合metal之类的工具,就很容易,基本上官方都帮你搞定了,但是服务器端的功能,swift做了一个sswg,swift server work group,那这一块,显然是java要好太多,java的maven,gradle等工具都非常健全了,还有数据库,jdbc之类的,那都是你随随便便就能找到无数的例子的东西
总体而言,java更偏向服务器端,网络,数据库等应用都相对方便许多,但是java的gui相对较弱,虽然有gluon在做,但是java要在客户端搞gui的跨平台,需要的工作比swift要多太多了,比如在win上要对接directx,在mac上要对接metal等,但是swift做客户端就容易很多,xcode里面你要用metal,sprite kit什么,直接用向导就能生成demo代码,你改就行了,但是如果你打算把swift当成java来用,那么相应需要付出的努力就要多太多,sswg上也慢慢有了网络,数据库连接等库,但是比起maven central上上千万的依赖,那还是差不少,甚至我感觉苹果的依赖,还没dart/flutter的那个pub热门,pub上依赖已经不少了,你开发的时候,都希望利用上已经做好的工具来节省你开发的时间和精力嘛,所以在生态上,这个差异是你需要考虑的
java并不是不能做客户端,swift也不是不能做服务器端,只是当你真这么去做的时候,需要付出的努力,那是要多太多了,写一个hello world跟真正干活,那还是不一样的,所以互为备胎是一个比较好的选择,就比如服务器端你用java,也可以顺带看看swift的sswg,反过来,客户端你用swift,也可以看看java的动作,javafx那些
最后java跟swift也在互相学习,java是公开承认借鉴了swift,而swift的一些库的作者,本身就是java同类型库的作者,比如做swift-nio的那个norman,其实就是netty的主要开发人员,所以swift nio公然在主页上写着:It's like Netty, but written for Swift. 苹果的一些组,也在用java的工具开发,比如norman在facebook访问的时候,就说到用netty还有vert.x的一些经验
java社区也一直有争议,就是希望分裂成客户端java和服务器端java,毕竟在场景上下文发生改变的时候,java的一些取舍也会发生改变,但是一直没有同意,从客户端的应用上看,其实dart,kotlin什么也多多少少在借鉴swift的经验,你看年底dart就要上空安全了
反正这些东西都不过是工具而已,你会一个,再看看其他几个,其实上手很快的,我们就是对实习生做这种要求,会java?很好,swift,dart,kotlin随便看看就开始写吧,反正都差不多,没啥神秘的,不要去神话这些东西,use it or lose it
参考