`
happmaoo
  • 浏览: 4343637 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

java现在真的不行了吗??

阅读更多

编程语言就像星星一样,没有一种语言可以永远星光闪耀,Java也不例外。虽然Java语言如此,但Java 平台却另当别论。今天即使Java语言出现下降的趋势,Java平台也仍比任何时候都增长得快。

 

       一次我在与DZone其他技术人员讨论技术问题的时候,我无意间表达了Java正处在下滑趋势的说法。这是有许多前车之鉴的,强大的C在被C++和后来的 Java挤下神坛之前也不过持续红火了20年多的时间。Java刚进入第二个十年,我们却已经看到了岁月沧桑和用户不满的痕迹。

 

那么Java会灭亡吗(Will Java Die?)

 

       就在这时,Rick Ross告诉我“Java并不仅是语言,是平台。”他说的很正确,Java远不单是语法定义的语言。我们已经看到很多语言扩展或者专门运行在JVM上。 JRuby和Scala 的成就已表明即使没有Java语法甚至没有Java库,平台仍可继续生存。

 

       在我看来Java今天达到的高度前所未有,然而我们看到Java平台的流行更在语言之上。所以Java的情形并不同于我们看到的其他语言的下场。那么是否Java自身会衰落却依然在平台中对其他语言扮演支持角色呢?

 

       这个问题我只能说我也不知道。反正我会支持Java,即使地球上只有三个人用它,我也是这三个人中的一个。在我看来,Java避免迷失在时间长河中的唯一方法就是,置于运行在JVM上的一种语言或多种语言中,而且能够与Java的库互操作。

 

 

这里一篇关于语言流行度无偏见评测的文章,本文是对客观实际评测的显示:

 

 

Java是最流行的语言,受欢迎度为20.8%;

 

占据第二位的是去年涨幅比Java少3.6%的C语言,现占13.9%;

 

Java的绝对人气比去年上升1.7%;

 

Ruby的受欢迎度是2.3%,排名11

 

Python是去年增幅最大的,增长2.0%,居第六位;

 

Python今年第一次超过了排在前面很长时间的对手Perl

 

Visual Basic(现在是第三代)在增幅上排第二位,Java排第三位;

 

Ruby的人气和去年相比下降了0.17%;

 

Perl,现排第七位,受欢迎度仍然是Ruby的一倍多;

 

C语言以1.89%跌落谷底;

 

C++以1.7%的幅度在下降幅度中排第二位;

 

C++下滑至第五位,因为它以前排在Visual BasicPHP之前;

 

PHP比去年增长了1.25%;

 

JavaVBC#结合的AKA.NET更受欢迎,尽管AKA.NET15.7%;

 

Delphi3.3%的迅猛增长超过JavascriptRuby

 

Lua从先前46名升至第十六位;

 

Groovy排名31

如果这些数字让你感到吃惊,或许你在阅读Blogs时会持更多的怀疑态度。

 

还有的人提出了Java语言的10大问题!!

 

   1、缺少闭包(closure):我想这个不需要解释了。函数式编程已经存在几十年了,但最近几年,它们获得了越来越多的关注,最主要的原因,是它可以自然地编写并行程序。我部分的同意Joshua Bloch强调在Java中引入闭包的问题需要再想一想(BGGA提议的方式真的很糟),至少闭包的缺失,使得在Java中做任何真正的函数式编程都是不可能的。

 

   2、缺少一等函数:这个问题与前一个有些关联,但我认为它更糟糕。在Java里,要达到类似效果的唯一方式,是使用著名的、丑陋悲惨的单方法匿名内部类,但这看上去的确是一个拙劣的方法。甚至在C#中,也通过代理机制,提供了一个更好的实现。

 

   3、原生类型(Primitive types):如果在Java中一切皆对象,那是多么完美啊,但他们偏偏不这样设计。因而,这一点导致了一些问题,比如,不能把一个int放到集合(Collection)里,这个在Java5中 通过自动装箱特性得到了解决(下面会提到)。它也造成了传值与传引用上的困扰,原生类型数据是通过值传给方法的(复制一份拷贝,然后传给函数),而真正的 对象是通过传递(译注:其实是复制对象地址再传递,因此应该也是传值方式,只是由于函数内部可通过这个对象地址访问对象,因此效果上类似传引用)。

 

   4、自动装箱(Autoboxing)和自动拆箱(autounboxing):这个特性是为了解决因原生类型的存在所导致的问题,在Java5引入的。它允许静默地转换原生类型到相应的对象,但这常常导致其它的问题。比如Integer可以为null,但int不能,因此这时JVM只能抛出一个难以调试的空指针异常(NullPointerException)。此外,它还可能导致其它奇怪的行为,就像下面的例子,我们就很难理解,变量test为什么是false

    Integer a = new Integer(1024);

    Integer b = new Integer(1024);

    boolean test = a < b || a == b || a > b;

 

    5、缺少范型具类化:范型是Java5引入的一个很酷的特征,但是为了保持与旧版本Java的兼容性,导致缺失某些重要的特性,尤其是不能在运行时反省范型的类型。例如,你有一个方法,接受List<?>参数,如果传进来一个List<String>,你却不能知道运行时该范型的确切类型。同理,你也不能创建范型数组。这意味着,尽管下面的代码看起来很自然,但却编译不了:

 

    List<String>[] listsOfStrings = new List<String>[3];

 

   6、不可避免的范型警告:你有发现过自己陷入不可能去掉的关于范型的警告么?如果你像我一样大量使用范型,我打赌你碰到过。事实上,是这个问题的规模化症状,让他们认为需要引入一个特定的注解 (@SuppressWarnings("unchecked")) 来处理这种情况,我觉得,范型应该可以被设计的更好。

 

  7、不能传void给方法调用:我得承认,这种给方法传递void的需求,乍一看有些怪异。我喜欢DSL,当我实现自己的DSL库(lambdaj)的一个特定特性时,我不得不需要一个方法声明成这样的签名:void doSomething(Object parameter),这里为这个方法传进来的参数parameter,是另一个方法调用的结果,它唯一的目的,是注册调用(的对象)自身,以可以在以后执行它。让我吃惊的是,即使println方法返回void,看上去也并没有一个好理由,不允许我把代码写成这样:

  

   doSomething(System.out.println("test"));

 

   8、没有原生的代理机制:代理是一种非常有效和应用广泛的模式,但Java提供的代理机制,只针对接口,而不是具体类。这是为什么象cblib这样提供这种机制的库,被如此多的主流框架,如SpringHibernate,采用的原因。此外,由于cglib通过运行时创建被代理类的子类来实现的,因此这些种方式有一个众所周知的限制——不能代理final类,比如String

 

  9、差劲的switch...case语句:Java规定,switch...case只能选择intenumJava5开始)。这一点如果跟更现代的语言如Scala相比,看起来简直太弱了。

 

  10、受检查异常(checked exception):类似原生类型,受检查异常也已经成为Java的一个罪孽之源。它迫使程序员必须做下面两件极其糟糕讨厌的事情中的一个:让你的代码里充斥大量的、糟糕难读的、容易出错的try...catch语句,而这样做的最大意义,只是将捕获的异常,包装成运行时异常,然后再重新抛出;或者是让大量的抛出声明子句污染你的API,让接口缺少灵活性和可扩展性。

 

   真正的问题是,这里我提到的这几大主要问题,唯一的解决办法,是要做一个痛苦的决择,定义一套新的语言规范,放下当前版本的向后兼容性。我猜他们永远也不会这么做,虽然我相信,如果编写一个能够自动转换旧Java源码的程序,让它们与假设的新版本兼容,并不是很困难。最后,这就是我决定开始寻找一个更好的JVM兼容语言的原因。

分享到:
评论

相关推荐

    JAVA自学之路

    有不少的同学发信给我,和我探讨java的自学过程应该是什么样的,毕竟有很多人因为各种各样的原因不能参加培训。我试着给出自己的见解,抛砖引玉吧。 这个路线图是给那些为了就业的人准备的,如果只是兴趣,不一定照...

    java 8实战 清晰带书签

    关于本书 简单地说,Java 8中的新增功能是自Java 1.0发布18年以来,Java发生的最大变化。没有去掉 任何东西,因此你现有的Java代码都能工作,但新功能提供了强大的...别急,这只是一个概览,现在该让你自己去看看本书了

    oflaDemo For RED5 1.0&&Java6

    但是,现在的网络这个例程一般都在线下不来;更要命的是,下下来用不了,会提示No scope "oflaDemo" on this server。我被这个搞得想自杀!换RED5的版本,从0.8-1.0,不行!从CSDN下载数个不同的 "oflaDemo" ,还是...

    java制作标签云图与界面展示

    标签云现在用javascript很容易实现,而且效果也很炫,在网络应用中比较多,但是java的桌面应用J2SE却很少,好像很难实现这种,但是最近发现java的图像界面也可以,我用的swt做的,实现用户关键词标签云生成。...

    Java手机游戏软件改键值

    2.由于软件现在还不是很完善,没有表明键值所对应的按键,我把对应的按键标在图片上了。如图 3.说明一下。在键值转换设定里面的转换键值栏里面更改物理按键键值,将需要更改的改成手机上现有按键的键值。比如原...

    java的传值与传引用详解

     既然现在我们已经知道了引用是什么东西,那么现在不妨来分析一下对象作是参数是如何传递的。还是先以一个程序为例: /* 例 3 */ /** * @(#) Test.java * @author fancy */ public class Test { public static...

    java基于wap飞信实现给好友发送短信,我测试过了的,能行,而且速度很快。

    我也是在网上搜了很久,搜出来都是不行,都是不能用了的,今天人气好,从网站上找到了,谢谢那个人,帮我解决了问题,所以来这跟大家一起分享哈!3分可能是有点 贵,但是为了避免更多人下载,乱发短信,现在飞信也...

    java6string源码-CloudMusicApi:网易云音乐API接口获取和分析

    现在问题来了,API接口知道了,直接访问行不行呢?答案是,肯定不行啊!最起码我们要把歌曲的id传过去,才可以找到指定的评论啊。 通过分析可以知道,参数没有放在URL中,所以参数肯定是post过去的。要不怎么说是...

    java7源码-distributed-lock:分布式锁

    java7 源码 现在面试都会聊聊分布式系统,通常面试官都会从服务框架(Spring Cloud、Dubbo),一路聊到分布式事务、分布式锁、ZooKeeper等知识。今天就来聊聊分布式锁这块的知识,先具体的来看看Redis分布式锁的实现...

    Java版水果管理系统源码-GitU:一个基于Java的gitGUI客户端来完成JavaScool项目

    这是我的Java期末课程设计的作业,原本的构思是一个基于DL4J的类keras框架,可是后来发现Java在这方面实在是不行,文档简陋,难以继续,又想开发一个markdown的Java版本的编辑器,但是发现解析器很多都是基于ruby,...

    PHP-Java-Bridge使用笔记

    是我在做平安银行开发的时候,本地使用PHP环境,平安银行接口为Java接口的...因为现在网上的教程基本上都不行了,所以在这里贴出我能使用的而且目前网上最新的版本(2014-09-19),如果有错,请通过邮件联系,谢谢。

    亲试过可以通过cygwin编译发布cocos2d-x几种中文乱码解决方案

    现在的网络情况就是N个网站同一个资源搜来搜去,让人越发焦虑。此文档也是我从几天焦虑中发现可以用的几种解决cocos2d-x中文乱码的方法。亲自试过了。cygwin可以编译过。但是我感觉直接在代码里面写宽字符=L("中文")...

    DeviceTree源码

    编写驱动的朋友就知道这个工具的作用了,查看设备,查看IRP都少不了它,现在公布源码,看样子是可以编译通过的,实际不知道行不行了,但是里面给出了核心思想。所以3个资源分就够了,希望能帮上又需要的朋友。

    JBuilder应用100例.rar

    JBuilder应用100例.rar 以前最牛B的JAVA IDE当属JBUILDER 现在不行了,eclipse,myeclipse,IntelliJ IDEA等 就当作期回忆吧

    jdk-8u211-linux-x64

    jdk-8u211-linux-x64.tar.gz,很多人需要,而且官网下载很慢,希望系统把分数弄低一点,让大家下载快一点,现在想设置0积分不行了,想改积分都不行. 解压密码:java

    分辨率修改工具

    注:还是有失败的可能,除了软件问题可能还有游戏本身的问题,如果失败可以换一个游戏版本试试,实在不行也没有办法。 结束语 触摸屏所常用的改键软件就这个了,虽然不是所有的软件都可以成功改键,不过多数游戏都...

    React开发实战

    总人数少了不行,近期活跃度低的也不行,缺一不可。如果总人数太少,持续增加的人较多,那你还是等等。微软出产品一般规律是:一版本是看着花哨,二版本是试着用用,三版本才算定型,过了三版之后,还能稳定,你再...

    字节面试经历(超详细包含谈薪技巧)

    其实这样是不行,视频面的时候要保证眼神对焦摄像头,保证面试 官想要跟你有眼神交流的能对上眼,保持起码的尊重。 4. 如何巧妙的回答“你有什么要问我的吗” 这个问题网上有很多的面经可以参考,我这里就表达一点,...

    struts项目搭建

    网上有说需要这个又有说不需要这个,需要根据实际情况来定,实在不行就自己一个一个加,先从struts的core包开始,如果缺少jar包启动的时候就会报错,缺哪个加哪个。 2、打开MyEclipse(我用的是6.5)新建Web工程 ...

Global site tag (gtag.js) - Google Analytics