Hello World
Spiga

标签:Java

为什么我不喜欢Go语言式的接口(即Structural Typing)

2013-04-10 18:37 by 老赵, 14627 visits
摘要:所谓Go语言式的接口,就是不用显示声明类型T实现了接口I,只要类型T的公开方法完全满足接口I的要求,就可以把类型T的对象用在需要接口I的地方。这种做法的学名叫做Structural Typing,有人也把它看作是一种静态的Duck Typing。除了Go的接口以外,类似的东西也有比如Scala里的Traits等等。有人觉得这个特性很好,但我个人并不喜欢这种做法,所以在这里谈谈它的缺点。当然这跟动态语言静态语言的讨论类似,不能简单粗暴的下一个“好”或“不好”的结论。 阅读全文

串与绳(1):.NET与Java里的String类型

2013-03-12 23:29 by 老赵, 8454 visits
摘要:话说“字符串”是我们平时最常用的数据类型之一,它表示一个字符序列。在大部分的语言中,字符串还是一个不可变(Immutable)的数据类型。“不可变”意味着要改变则只能生成新的字符串,无论是连接两个字符串,获取或是替换字符串的一部分,这对于内存和CPU都是不可避免的开销。在一般情况下,只要使用合理这些开销都不会构成大问题。不过对于某些类型的应用,例如我前段时间在工作中涉及到的编辑器(IDE那种),就会带来较多麻烦,于是便用到了一个名为Rope的数据结构。Rope其实是一种很简单,很符合直觉的树状数据结构,也常用于表达一个字符序列,不过更适合需要大量修改的场景。不过,我们还是先来回顾一下.NET与Java中的String类型吧。 阅读全文

挖坟鞭尸:当年Sun公司的白皮书《About Microsoft “Delegates”》

2011-11-09 01:07 by 老赵, 6724 visits
摘要:这是一桩当年的Sun公司与Java的旧事,还要追溯到C#还没出现,微软还在搞J++的时代。这篇著名的白皮书便是《About Microsoft “Delegates”》,其中列出了Sun眼中的Delegate的多个缺点。最后,在白皮书里信誓旦旦地写到:“Bound Method Reference并不是语言发展的正确道路”。我的感觉是:不谈Java语言设计者的水平如何,至少这篇白皮书的作者,在语言设计的能力或品味上几乎落后了Anders Hejlsberg十年。从我之前翻译过的一篇文章来看,Anders一直扮演着指引语言发展方向的作用,这也是为什么C#在这十年的发展能比Java要健康得多的主要原因之一。 阅读全文

匿名类型的硬伤:围绕this的成员捕获策略

2011-06-15 17:27 by 老赵, 7325 visits
摘要:时不时听到一些C#程序员说,希望在C#里出现像Java匿名类一样的特性。以前我也觉得Java里的匿名类是个不错的特性,C#应该吸取进来。不过前段时间我仔细地理解了Java语言规范中关于内部类、匿名类的部分之后,一下子就被恶心到了。恶心过后,我忽然也意识到有些问题的确也是硬伤,也不能指责Java设计者的“品位”。例如,现在我想要谈的关于匿名类中this使用的问题——如果C#没法漂亮地实现这个特性,我宁愿它继续保持现状。 阅读全文

分清“语言/规范”以及“平台/实现”,以及跨平台.NET开发

2011-01-13 23:35 by 老赵, 5229 visits
摘要:在许多年前,“语言”就等同于“平台”,例如C,C++以及最早的Ruby和Python等等。但是随着技术发展,出现了一些通用的平台,例如.NET和Java,逐渐这些平台上的语言也越来越多。再后来,某些语言在不同平台上的实现也越来越多,事情也变得有些复杂。技术在发展,但是从目前社区的讨论中,我发现许多朋友的观念还没有跟上。简单地说,如今的观念,一定要从“语言即平台”切换成“语言及平台”,当分清“语言”和“平台”这两个不同事物之后,许多问题才能讨论地清楚。而且,这点对于.NET程序员来说尤为重要,因为C#语言可以说是目前“平台”、“实现”最为广泛的“语言”之一了。 阅读全文

Why Java Sucks and C# Rocks(6):yield及其作用

2010-07-18 21:26 by 老赵, 9706 visits
摘要:C# 2.0新增了yield关键字,其初衷是简化迭代器的生成,这可以说是现代语言的标配。只可惜Java历经数次升级,从数量上来说也算增加了不少语言特性了,却还是将这个功能拒之门外,让人费解。除了用于生成迭代器之外,yield还可用于其它一些场景,颇为奇妙。这些场景都是在生产过程中常用的开发模式,只可惜对于使用Java语言的程序员来说都只能望而兴叹了。 阅读全文

Why Java Sucks and C# Rocks(补2):标准事件模型

2010-07-13 09:17 by 老赵, 4561 visits
摘要:这又是一篇“补”,本来并不想写这方面的内容,因为这并非完全是“语言”相关。打个比方,如果您觉得.NET中的事件模型不友好,那么就按Java的做法去做咯(反之就做不到了)。不过既然正好看到有些涉及到这方面的讨论,那么我也趁此机会发表一下自己的看法吧。这次谈的是两种语言(其实在这个话题上也是平台)下“标准”的事件模型。“标准”二字意味着是被双方社区各自接受的模型,而不仅仅是为了实现“事件”这一理念而使用的任意做法。 阅读全文

Why Java Sucks and C# Rocks(5):匿名方法

2010-07-06 14:22 by 老赵, 5908 visits
摘要:确切地说,这里的标题应该是“C#中的匿名方法”,因为这是C#中特有的功能。在之前的文章里,虽然我都用长篇文字加代码示例来说明问题,但总有朋友认为我谈的只是C#和Java的“区别”,算不上优势。不过从这篇文章开始,我们将正式进入C# 2.0的时代,这也是C#大步甩开Java语言的开端——可以看出,Anders Hejlsberg从此开始实现他对于编程语言的各种理想,而并非纠缠于与Java所谓的“竞争”中。例如这篇文章要讨论的“匿名方法”特性,以及随之而来的“函数式编程”痕迹,便开始引领C#在开发理念上的进步。 阅读全文

Why Java Sucks and C# Rocks(补1):Reddit,兼谈C#属性

2010-06-28 14:18 by 老赵, 5831 visits
摘要:最近博客冷清了不少,主要是事情较多,一是.NET交流会,二是工作,三是几篇暂时无法发在博客上的文章。周末在家,发现邮箱里经常收到SlideShare的邮件,说是我的Why Java Suck and C# Rocks幻灯片在推特上很火热。今天早上忽然发现,它被人发到Reddit的编程版块了,讨论地颇为热烈。关于讨论内容,您可以亲自阅读一下。最近的讨论也让我想要补充一些关于C#属性的问题。 阅读全文

趣味编程:在JavaScript中实现简单的yield功能(问题)

2010-06-08 15:33 by 老赵, 7840 visits
摘要:说起迭代器(Iterator)大家一定都不陌生,无论是是Java,C#或是Python等语言都有内置标准的迭代器结构,它们也都提供了内置的for或foreach关键字简化迭代器的“使用”。不过对于迭代器的“生成”,不同语言之间的就会有很大差距。例如,在C#和Python中都提供了yield来简化迭代器的“创建”,此时生成一个迭代器便再简单不过了。但对于Java程序员来说,即使到了Java 7还必须为在迭代器内部手动维护状态,非常痛苦。而更重要的一点是,利用yield我们可以轻松地创建一个“延迟”的,“无限”的序列。那么,我们能否在JavaScript中享受到这样的yield生成器呢? 阅读全文

浅谈Java 7的闭包与Lambda表达式之优劣

2010-06-06 15:31 by 老赵, 16472 visits
摘要:前几天Oracle推出了Java 7官方的闭包与Lambda表达式的第一个实现,这基本上也是最终在正式版中的样式了。看了这个实现之后,我的第一感觉便是“丑”,当然不排除这是因为看惯了其他语言中实现的缘故。后来再仔细看了看又想了想,发现Java 7的实现也并非毫无可取之处,但似乎又感到某些做法上有一些问题。总之整个过程颇为有趣,决定将我的想法记录下来,希望可以吸引人来一起讨论一下。 阅读全文

跨平台到底是不是谎言?

2010-06-02 11:05 by 老赵, 8488 visits
摘要:前几天是个神奇的日子,博客园里咣咣咣地出现了三篇文章,都包含了“跨平台”和“谎言”这两个关键字。从Java开始谈到.NET,最后哐地一下,“跨平台”本身也变成一种谎言了。从文章内容上看,我个人觉得基本不靠谱,主要论述方式是用“气势”或是“自信”来压倒对方……呃,是“说服别人”。我不打算谈那两篇文章的内容了,许多意见我和其他人也在文章后面回复过了。我现在只想在这里简单谈谈我对“跨平台”这个问题的看法。 阅读全文

Why Java Sucks and C# Rocks(4):泛型

2010-05-18 00:23 by 老赵, 10231 visits
摘要:Java 5.0和C# 2.0发布于同一年,各自添加了一个重要的特性:泛型。泛型可以让程序员针对泛化的数据类型编写相同的算法,这大大增强了两种语言的类型系统及抽象能力。不过即便是这看似相近的功能,Java和C#两者在语言实现和功能上也有很明显的区别,这甚至会形成编程方式上的不同。在这里可能需要事先打声招呼,因为在这个特定的话题上,语言和运行时的确是密不可分的,因此在这篇文章中我会涉及到相对较多的“运行平台”上的比较,而这点在整个系列中是我尽量避免的。不过您请放心,只此一次,欢迎监督。 阅读全文

Why Java Sucks and C# Rocks(3):Attribute与Annotation

2010-04-25 23:14 by 老赵, 11025 visits
摘要:上一篇文章里我谈了Java和C#语言中对于基础类型的不同态度,我认为C#把基础类型视做对象的做法比Java更有“万物皆对象”的理念,使用起来也更为方便。此外,C#拥有一个Java 1.4所不存在的特性,即Attribute(自定义特性),而在之后的Java 5.0中也增加了类似的功能,这便是Annotation(标注)。那么,Attribute的作用是什么,Java中的Annotation和C#中的Attribute又有什么区别呢,Java 5.0中又从C# 1.0中吸收了哪些优点?我们现在就来关注这方面的问题。 阅读全文

Why Java Sucks and C# Rocks(2):基础类型与面向对象

2010-04-20 23:44 by 老赵, 12977 visits
摘要:既然已经谈过这次语言比较的意义与目的,而完整的幻灯片和录音也已经放出,那么接下来自然是详细讨论了。在这篇文章中,我会对两个语言的基本特征进行简单描述,并主要讨论两者对于基础类型的处理方式。在我看来,Java语言对于基础类型的处理方式,并不如C#中值类型般妥当。如果您有任何觉得不妥或是想要补充的意见,请不吝回复。由于C# 1.0发布于2002年,因此本文内容将基于Java 1.4及C# 1.0的情况。 阅读全文

幻灯片:Why Java Sucks and C# Rocks

2010-04-18 17:52 by 老赵, 14812 visits
摘要:昨天在5173与博客园联合举办的技术交流活动中进行了演讲,现在幻灯片终于可以放出了。当然,光看幻灯片本身的效果不大,在演讲过程中我进行了非常多的代码演示和说明,幻灯片本身只能算是一个提纲,因此各位没有来听演讲的朋友,还是等我慢慢地对这个话题进行详细讨论吧。只是有些话我不得不说:Java平台的开放只能反衬出一些Java粉丝的狭隘心态和视野,我一个封闭的微软平台的封闭的.NET程序员,如果心态和眼界都比您要开阔,这难道不够讽刺吗? 阅读全文

Why Java Sucks and C# Rocks(1):比较的意义与目的

2010-04-16 23:48 by 老赵, 32972 visits
摘要:消息发布之后,许多朋友都表示对我这个主题的关注——无论是正面还是负面的——这让我很高兴。不过说实话,我原本并没有打算写这篇文章。我原本的打算是从一开始就进行技术方面的讨论,但是大家在前文的反馈让我把一些问题想得更清楚了,也认识到有些东西可能需要先说在前面可以有更好的效果。希望各位朋友可以继续给我一些反馈,这样我可以在必要的时候进行补充更完整的内容。这次的话题很有价值,我想把它做的更好。 阅读全文

演讲预告:Why Java Sucks and C# Rocks

2010-04-11 16:49 by 老赵, 13522 visits
摘要:怎么样,这个标题是不是足够吸引眼球?嗯,我下个星期便打算在5173和博客园举办的技术交流会上讨论一下这个话题。原本这是一个为盛大创新院内部分享交流会准备的内容,不过正好5173要举办一个技术交流会──还有比那儿更适合这个话题的地方吗?直到现在,还有许多朋友认为,Java语言和C#的区别并不大,也有人认为C#只是语法糖比较多,没有什么特别的——而我现在便打算详细阐述C#是如何改变开发人员“编程理念”及“思维方式”,并在生产力上大大超越Java语言。我也打算在会后将这个内容详细地总结成一系列文章,除了发表在博客上,还会转载去一些Java开发社区,看看那儿的弟兄们对这个话题会怎么看。 阅读全文

事理越辩越明,那么就来详细说说为什么我不喜欢Java*语言*

2009-04-19 02:56 by 老赵, 37470 visits
摘要:最近我对Java语言唱衰似乎凶狠了一点,让有些朋友不是很爽,认为我不负责任凭个人感觉乱说话,影响不好。这讨论事情事小,否认我做事方式就不好了。因此我这里也继续整理一下我对Java语言的观点,这样大家不必四处查看我的说辞,再者也可以控制一下讨论事情的方式,以免大家舞蹈半天尘土飞扬最后停下一看——得,双方在自说自话,这怎能辩明事理,您说呢? 阅读全文
1
使用Live Messenger联系我