横刀天笑的碎碎念

📅 2026/7/5 4:08:39
横刀天笑的碎碎念
我原来是使用C#语言的和现在的Java语言相比现在的Java语言语法就停留在C# 2.0这个年代。语法结构都非常传统中规中矩。很突出的一点是因为缺少对闭包的支持有些用C#很容易做到的用Java需要写很多废话代码。前几天InfoQ上发表了一篇英国卫报逐步采用Scala替换Java的文章里一句话用的很好看Java的代码很容易让你只见树木不见森林。因为为了实现某个功能你需要太多的支撑代码而实现功能的关键代码却迷失了。举个例子我需要一个排好序的用户列表排序的依据是用户名字。很简单的需求对不。自然的代码肯定是这样的IListUser users …users.OrderBy(user user.Name);而如果用Java实现同样的功能你可能要这样写ListUser users …Collections.sort(users,new ComparatorUser() {public int compare(User left, User right) {return left.getName().compareTo(right.getName());}});第一没有扩展方法的支持只有借助静态的辅助类第二没有闭包的支持非要写个难看的匿名类其实我们只需要一个OrderBy一看就明白但现在多了这么多“无用”的代码反而核心的价值order by却显得不那么重要了。这还是一个很简单的例子在实际的项目中你会为此付出更多的代价你要写出一堆味同嚼蜡的代码才能实现你想要的那个功能而那个功能其实是很显而易见。所以在语言层面Java没有任何亮点只觉得罗里罗嗦。关于语言层面的比较老赵写过很多而且非常精彩建议去欣赏一下。不过Java也有那么很少几个有点意思的小东西比如静态导入脑袋提醒这东西很早就在VB里出现了、以及Java对Annotation的特殊支持让我们可以做一个更有意思的事情。概念满天飞做Java以来让我感触最深的是在Java世界里概念满天飞。ORMIOCAOP这几个在.NET的世界里也有但没见过这么浓的但是如果你做Java应用你不熟悉这几个你都不好意思出去跟人打招呼所以除了学习Java本身外还有一大堆开源框架等着你研究。还有什么View ModelPresentation ModelValidatorBROBusiness Rule ObjectBPOBusiness Process Object,BDD。关键是不仅是概念上存在这样的名词它还大量的出现在代码里。代码里将概念描述得淋漓尽致还规规矩矩。或许我土老帽了我开发.NET三年有余从来没整这些玩意儿。但是我一点也不怀疑我的代码难以阅读难以维护。配置文件你能再多一点么我超级厌恶Spring的配置文件虽然你说这只是个框架但貌似Java社区有这个趋向。虽然Spring现在也增加了注解Annotation的支持但是还有那么一些知道的和不知道的原因项目中存在大量的配置文件。而且为了“模块性”一个小小的配置文件又包含有几个配置文件。有配置controller的有配置DAO的有配置service的。额还有那该死的Hibernate的hbm文件。我想系统的复杂性就是这么一点一点的堆积而来的。ASP.NET的配置文件一度也有变得更臃肿的趋势但最后还是大大瘦身.NET 4.0里默认的web.config很小了。而且Attribute在.NET的第一个版本就出现了很多可配置的东西都提供了Attribute的API和XML的API所以没有历史遗留包袱。开源这个我喜欢Java里的开源软件远远超过.NET的这可能跟微软有一定的关系吧。如果你想完成一项工作总会有一个开源软件适合你。比如我们要做一个定时调度的任务马上就有Quartz跑到了你的视野你只需实现几个接口然后在配置文件里配置一下又是该死的配置文件又比如你苦于在Java里没法像C#里那样用Lambda马上有个跟你一样想法的人开发了一个lambda4jJava人有个说法是语言不足类库来补不过Java这个语言太不足了所以有的时候类库补也补不好。你可以在琳琅满目的开源框架和开源类库里寻找一个最合适的然后打开这个潘多拉魔盒。最主要的是她还是开放的你不仅可以学习其代码思想如果你发现有问题你甚至可以提交代码那种成就感我倒是在开发.NET时没有感觉到。比如你要开发高性能服务器在.NET里还没见过这类的开源项目可Java里你可以学习Netty可以学习Mina你甚至可以根据自己具体的业务场景对这些开源软件进行适当的修改。当然你可以说思想是一样的这倒是不错。但因为IO模型在Java里和.NET里并不一样所以还是有很多不同的当然我觉得.NET的异步IO更容易使用Java的NIO那是什么狗屎一样的API啊。IDE搞开发的肯定离不开IDE。.NET里的IDE当之无愧的是Visual Studio了。不过我却觉得Visual Studio这几年已经离开发人员越来越远了好像他要搞什么全生命周期的软件开发工具。所以不但臃肿而且对开发人员并不是很友好当然她的可视化设计器是无与伦比的但我不觉得可视化设计器是什么开发人员的“利器”。举两个例子VS里大量使用组合快捷键。这样不仅使得快捷键过长难以记忆而且还好难使用啊你必须按两次而且时间不能间隔太长。还有VS的重构功能太弱了。在Java里有各种各样的IDE有免费的有收费的。我很喜欢的一个就是Intellij Idea。Idea给我的印象就是她真的是在关注开发人员写代码的这个角色。所有的快捷键都很简单好用好记。比如大部分东西在Idea里可以使用AltEnter这个万能快捷键解决这个快捷键是上下文感知的在不同上下文中它知道要干什么。再就是Idea对重构的支持如果你熟练之后做一项大的重构你都无需手动的去修改什么代码直接依靠IDE的支持就可以完成这在安全的重构里是很重要的一点手动的去修改代码重构如果在测试不完备的情况下风险是非常高的。当然VS也有很多非常好用的插件可以提高开发效率。比如大名鼎鼎的Resharper就来自于Intellij Idea同一个公司由这个插件你可以看到Idea是如何关注写代码的人的效率。JVM vs CLR一般的Java跑在JVM上C#跑在CLR上。从技术实现上他们两平分秋色各有各的优点我们不能评价他们的好坏。只能说可能JVM在XXX上胜过CLRCLR在XXX上胜过JVM。而且JVM和CLR有居多相似之处大多数东西都可以在对方找到相应的东西。那么她们就无法比较了么不是经过一年的学习我表示我更喜欢JVM一点。JVM在这里只假设是Oracle/Sun Hotspot JVM暴露了众多的配置参数给开发人员。你可以通过这些参数间接地控制JVM的运行。就比如GC吧JVM里有各种参数来控制各个代的大小还可以通过参数让JVM采用什么样的垃圾收集策略。因为不同类型的应用比如桌面的、服务器端得、内存小的等等不同类型的应用适合不同的垃圾收集策略。而CLR在垃圾收集上只给开发人员提供了Workstation是否是concurrent GC.net 4.0是background GC/Server等很少的控制不过也几乎很少用到。当然如果你想最大化控制CLR你就只有自己Host CLR然后调用Host API进行控制但是那样难度高很多。我很愿意承认CLR是自适应的她能自动的智能的识别出你的需求然后自动的进行调整。不过我在这里主要想到的是微软在这里扮演着保姆的角色。在你很小的时候保姆能够在一定程度上保护你免你受到伤害。但是你不能永远生活在保姆的怀抱里如果你想变得更强大你需要自己独自一人出去看看。注这一节不是比较JVM和CLR因为我没有那个能力。只是想从JVM和CLR所表现出来的差异来看看一些“看不见的东西”。开发人员上面主要谈了技术层面的东西。现在说说软件开发中的人。我现在所在的公司面试有个特点会让面试者做一份家庭作业然后让公司同事Code Review。在这一年里我看了很多Java的代码也看了很多C#代码。但是我伤心的发现1、虽然Java的也有烂代码但是Java代码大多更注意代码的美感。大家都非常注意选择方法名变量名类名等。也非常愿意写一些小的容易理解的方法小的目的明确的类。可我亲爱的.NET同行们大多在这方面很随意。一个方法200行不算长甚至一个功能就放到一个方法里实现了。我看呀看呀都看不到尽头。更别说类职责单一了。2、测试 Java同学的代码大多有测试虽然有的测试不怎么好但最起码有那么几个测测核心功能。但是.NET代码呢很难见到几个有测试的难道这是因为VS很晚才加入对Unit Test的支持有关。我不是说一定要有测试我只是描述一下这么个现象。3、你也太随意了。我见到有那么几份.NET代码我知道你创建了一个WinForm的项目然后你却不把VS自动生成的那几个Form1.cs,Form1.resx给删掉。4、构建 从构建这个层面就更显出问题了Java同学提交的代码大多有构建的脚本无论是Ant还是Maven所以你只需要敲一个命令行马上可以看见人家的结果。而.NET同学的基本上都是sln文件。这一点不是说谁好谁坏的因为我之前做.NET也从来没有自动构建脚本我只想说两个社区有些不同