离开Java,寻找更佳语言的10大理由

基于物联网技术智慧园林绿化养护管理信息平台 近几年来,随着经济不断的发展,城市面积不断的扩大,城市管理中的园林绿化工作也在这种趋势下不断的发生着深刻改变。管养企业是否按制定的管养计划严格执行?绿化事件整改是否及时到位?绿地面积是否在稳步增长?管养的效果如何?如何客观评价管养企业的管养工作?这些都是我们各级管理者需要面对的问题。   智慧园林绿化养护管理信息平台的开发思路以“考核”为核心,整个信息平台体现出“新、快、高、全、享”五个特点。   智慧园林绿化养护管理信息平台的整个开发理念为:依托五大技术手段(全球卫星定位系统技术、地理信... 阅读详情

别误解,其实在我的职业生涯中,我已经编写了无数的Java代码;而且,我仍然认为Java一门伟大的(程序)语言。 相对于C++和Smalltack,Java已经有了很大的改进;但现在,即使是Java,也已经开始感觉到了其15年的积重。

事实上,在我的经历中,我总是不得不面对Java的设计和规范上的一些错误、缺陷和不足,这些东西,让我的Java程序员生活少有乐趣可言。

现在全世界的Java程序员有数百万之众,Java写就的代码更达数亿行,要是我说Java在不久的将来死去,这还有些远。不管怎样,随着一些兼容JVM的语言出现(我最钟意Scala)后,这些问题变得越发不能容忍了,我开始想,是时候慢慢离开Java了(但并不脱离JVM)。

具体说来,我认为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:

Intger a = new Integer(1024);
Intger b = new Integer(1024);
boolean test = a < b || a == b || a > b;

5、缺少范型具类化:

范型是Java5引入的一个很酷的特征,但是为了保持与旧版本Java的兼容性,导致缺失某些重要的特性,尤其是不能在运行时反省范型的类型。

例如,你有一个方法,接受List参数,如果传进来一个List,你却不能知道运行里该范型的确切类型。 同理,你也不能创建范型数组。这意味着,尽管下面的代码看起来很自然,但却不编译不了:?>

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这样提供这种机制的库,被如此多的主流框架,如Spring和Hibernate,采用的原因。

此外,由于cglib通过运行时创建被代理类的子类来实现的,因此这些种方式有一个众所周知的限制——不能代理final类,比如String。

9、差劲的Switch…case语句:

Java规定,switch…case只能选择int和enum(Java5开始)。这一点如果跟更现代的语言如Scala相比,看起来简直太弱了。

10、受检查异常(Checked exception):

类似原生类型,受检查异常也已经成为Java的一个罪孽之源。

它迫使程序员必须做下面两件极其糟糕讨厌的事情中的一个:让你的代码里充斥大量的、糟糕难读的、容易出错的try…catch语句,而这样做的最大意义,只是将捕获的异常,包装成运行时异常,然后再重新抛出;或者是让大量的抛出声明子句污染你的API,让接口缺少灵活性和可扩展性。

真正的问题是,这里我提到的这几大主要问题,唯一的解决办法,是要做一个痛苦的决择,定义一套新的语言规范,放下当前版本的向后兼容性。

我猜他们永远也不会这么做,虽然我相信,如果编写一个能够自动转换旧Java源码的程序,让它们与假设的新版本兼容,并不是很困难。最后,这就是我决定开始寻找一个更好的JVM兼容语言的原因。

注:原文见TSS http://www.theserverside.com/news/thread.tss?thread_id=55185,感觉作者说的还是有些道理的。

中文来源:http://justjavac.com/java/2012/04/18/beyond-java-find-10-better-language/

【忍者算法】从生活案例理解滑动窗口最大值:一个超直观的思路讲解|LeetCode 239 滑动窗口最大值 点此看全部题解更多干货,请关注公众号【忍者算法】,回复【刷题清单】获取完整题解目录~ 阅读详情

相关推荐

MapGIS地质剖面图绘制实战:从数据准备到整饰出图

本文详细解析了MapGIS地质剖面图绘制的全流程,从数据准备到整饰出图,涵盖了等高线处理、GRD格网化、比例尺控制等关键步骤。通过实战技巧和案例分析,帮助地质工作者高效完成专业地质剖面图绘制,提升矿产勘探和工程勘察的工作效率。

weixin_28335283的博客 592

MC9S08SF4内存架构深度解析:RAM优化与Flash安全编程实战

在嵌入式系统开发中,内存管理是核心基础。RAM作为程序运行时的工作区,其寻址方式和访问效率直接影响代码性能。Flash存储器则承载着固件代码与关键数据,其编程、擦除机制及保护功能是系统可靠性与安全性的基石。理解内存的物理特性与控制器的工作原理,对于实现高效、稳定的嵌入式应用至关重要。本文聚焦于经典8位微控制器MC9S08SF4,深入探讨其系统RAM的直接页寻址与位操作优化技巧,以及Flash存储器的在线编程、块保护与安全机制。通过剖析直接页变量分配、栈指针重定位、Flash命令序列执行流程及后门密钥等热词技

justJavaC的专栏 376

Python《打砖块》小游戏

Python《打砖块》小游戏!

PanDaoxi 1273

JAVA开发中常见问题

JAVA开发工作常见问题收集录

Mr_Hellon的博客 7118

【OpenClaw从入门到精通】第09篇:企业级实践——将OpenClaw接入钉钉,打造7×24小时数字员工(2026实测版)

本文聚焦OpenClaw的企业级落地实践,以“招聘数字专员”为核心场景,完整演示从钉钉接入到全流程自动化的实现路径。内容涵盖企业级部署架构设计、前置环境搭建、核心技能开发、流程串联、安全权限管控及运维监控六大模块,详解简历解析、岗位匹配、外呼集成、CRM同步、日历提醒等关键技能的构建逻辑与代码实现。借鉴中关村科金、网易智企的企业级实践经验,重点突破企业知识融合、安全权限管控、业务系统连接三大核心门槛,提供可直接参考的配置示例与操作步骤。所有技术方案均基于公开文档与实测验证,兼顾新手入门与进阶实操。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1169

YOLOv11改进 | Neck篇 | 双向特征金字塔网络BiFPN助力YOLOv11有效涨点

本文给大家带来的改进机制是BiFPN双向特征金字塔网络,其是一种特征融合层的结构,也就是我们本文改进YOLOv11模型中的Neck部分,它的主要思想是通过多层级的特征金字塔和双向信息传递来提高精度。本文给大家带来的结构可以让大家自行调节网络结构大小,同时能够达到一定的轻量化效果,为什么发BiFPN呢因为它算是YOLO系列改进中的常青树了,大家可以借鉴它的双向特征思想来创新自己的Neck结构本文的BiFPN通过yaml文件配置可以让大家自行调配其结构。

Snu77的博客 9095

Java常见问题

notifyAll():notifyAll()方法会将所有在等待集合中的线程唤醒,但由于所有的被唤醒的线程仍然要去争用synchronized锁,而synchronized锁具有排他性,最终只有一个线程获得该锁,进行执行状态,其他线程仍要继续等待。当线程调用wait()方法后,Java虚拟机会让当前的线程进入到休眠状态,并释放对对象的同步锁的控制权,允许其他线程执行该同步代码,要唤醒该线程,需要在同一个对象上调用notify()或notifyAll()方法。s1 = s1+1;

zyhhkb的博客 940

由浅入深理解Latent Diffusion/Stable Diffusion(5):利用预训练模型快速开始自己的科研任务

从零开始训练一个stable diffusion大概需要16万美元和1个月的时间,这对于一般的科研工作者来说难以承受,所以如何利用预训练模型快速开始自己的科研训练是一个非常有价值的问题。这篇博客将演示如何利用预训练模型快速开始自己的科研任务,希望对大家有所帮助!

沉迷单车的追风少年 3368

关于Java的语言问题汇总

第一章1.面向对象程序设计的基本特征有哪些?1.封装 指将对象相关的状态信息和行为捆绑为一个逻辑单元,通过封装可以隐藏一个类的实现细节。 2.继承 通过类之间的继承,实现了代码的复用,在子类中可以新增属性和方法,并且可以重写父类方法的具体实现方式。 3.多态 多态在java中是指对象变量是多态的,一个类型为A的变量既可以指向类型为A的对象,又可以指向A的任何子类的对象。一个接口类型的变量也

1982

kylinos-SP3的软件包降级到V10-SP1中的版本

如果想再次回退到原来版本,将repo改为原来的SP3版本,然后执行yum history 查看ID号,执行yum history rollback ID就可以恢复了。此时我们发现已安装的版本是1.32-2.ky10,而sp1网络源里的版本是1.30-11.ky10,我们将降级安装网络源中的低版本软件包。近期有个客户想要把kylinos-V10-sp3的软件包降级到kylinos-V10-SP1的版本。3、以tar包为例,查看已安装版本及网络源中其他版本。1、查看系统版本,确认是V10-SP3。

太极淘的博客 1103

Linux内核配置选项详解及编译过程

在内核编译完成后,可以通过重启系统并选择新编译的内核来使用它。可以在该菜单下选择需要编译进内核的设备驱动,也可以选择将设备驱动编译为模块。可以在该菜单下选择需要编译进内核的设备驱动,也可以选择将设备驱动编译为模块。可以选择需要的调试选项,并根据需要启用或禁用相应的功能。可以选择需要的文件系统类型,并根据需要启用或禁用相应的选项。可以选择需要的网络协议和功能,并根据需要启用或禁用相应的选项。可以选择需要的调试选项,并根据需要启用或禁用相应的功能。可以选择需要的文件系统类型,并根据需要启用或禁用相应的选项。

TechGlide的博客 746

Java开发中常见的问题、异常及解决方案

Java开发中常见的问题、异常及解决方案

小楊同學 1万+

【100%通过率】华为OD机试真题 Python 实现【网上商城优惠活动 / 模拟商场优惠打折II】

某网上商场举办优惠活动,发布了满减、打折、无门槛3种 优惠券,分别为: 1:每满100元优惠10元,无使用数限制,如100~199元可以使用1张减10元,200~299可使用2张减20元,以此类推; 2:92折券,1次限使用1张,如100元,则优惠后为92元, 3:无门槛5元优惠券,无使用数限制,直接减5元。

MISAYAONE的博客 9369

离开Java,寻找更佳语言的10大理由(更新)

注1:原文见TSS[http://www.theserverside.com/news/thread.tss?thread_id=55185],感觉作者说的还是有些道理的。原文标题:10 good reasons to look for something better than Java。 注2:翻译并不代表同意原作者的意见,这篇译文曾被推荐到JavaEye新闻,引起较大的争论。可能是本文的标...

liuu 166

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

java记录

1. 包装类与自动装箱问题:在justjavac的博客上看到翻译的一篇文章 离开java,寻找更佳语言的十大理由中关于自动装箱的一个描述: 这个特性是为了解决因原生类型的存在所导致的问题,在Java5引入的。它允许静默地转换原生类型到相应的对象,但这常常导致其它的问题。 比如Integer可以为null,但int不能,因此这时JVM只能抛出一个难以调试的空指针异常(NullPointerE...

weixin_30750335的博客 125

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

TheServerSide网站2009年最热文章

  TheServerSide虽然已经风光不再,但仍然是Java领域不可忽视的重要技术网站(他们自称仍然是最大的Java社区)。他们刚刚发布了2009年最火的9条帖子,是Java社区一年关注点的生动记录,让我们一起来回顾一下吧。 1. JPA comparison: Hibernate, Toplink, OpenJPA, Eclipselink   (JPA实现大比拼:H

优快云与《程序员》总编观察 2007

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Blog archives - justjavac

You can visit his blog from justjavac. Below is the catalog of his blog. justjavac的博客 专注最时髦的web开发技术 jekyll 为 jekyll 博客添加 category 分类使用jekyll在Github上搭建博客Markdown 语法 (简体中文版)ma

redalert2c的专栏 960

离开的最后感慨,最好的话语

今天应该是在这家公司的最后一天了吧。 一切照常,还是那个时间起床,那个时间出门,那个时间打公交,那个时间转地铁。 公交地铁还是那么多人,我放在包里的早餐再次被挤扁了。 不是什么原因,也许今天没有以前的心态,在出地铁站(公司就在地铁站边上)的时候,跨上出地铁的手扶电梯,抬头往上看去,发现原来这里是这么的陌生,好像第一次过来。 今天,广州开始降温,我的心里却没有之前那么寒冷,或

lz0426001的专栏 2047

Java 语言的几个缺陷(个人感觉)

Java 语言由于一直要保持源代码及二进制的向后兼容, 所以尽管...

weixin_33762321的博客 348

解决无法将java项目部署到tomcat中去

前言:   project facets java转成web项目   用Eclipse开发项目的时候,把一个Web项目导入到Eclipse里会变成了一个Java工程,将无法在Tomcat中进行部署运行。   方法:   1.找到.project文件,找到里面的<natures>标签,查看是否有下面的代码,没有则复制进去。   Xml代码 <nature&...

weixin_30323961的博客 335

Java语言问题

第一章Java基本概念及环境 FAQ1.01什么事面向对象编程? 解答:面向对象编程即是OOP,将对象作为程序的基本单元,并将程序和数据封装在其中,以提高软件的重用性,灵活性,和扩展性,每一个对象都是现实世界中的一个具体事物(或实体)。 FAQ1.02 面向对象程序设计的基本特征有那些? 解答:三大基本特征:封装、继承、多态。 封装:是隐藏一切可以隐藏的东西,只对外提供一个接口,或方法。 继承:一...

weixin_42829146的博客 267

Spring AI + GPT-5.5 + Ollama 配置教程:Base URL、超时与流式调用

由于不同 Spring AI、Spring Boot 小版本之间仍可能存在差异,创建项目时应检查 Spring Initializr、Spring AI BOM 和官方兼容矩阵,不要直接复制旧教程中的 Starter 名称和版本号。多人项目最好隔离不同客户端,并在脱敏前提下记录最终 URL、状态码、请求耗时、请求 ID 和模型 ID。Spring AI 接入模型 API,至少要同时确认 Starter、Base URL、请求路径、API Key、模型 ID、连接超时、读取超时和流式客户端这 8 项。

2601_95893075的博客 223
上一篇: 26个提升java性能需要注意的地方
下一篇: web.py 0.3 新手指南
迷渡
迷渡 领域专家: 前端开发技术领域 领域专家: 前端开发技术领域
博客等级 码龄19年 2405粉丝 124原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值