Java SE 11:推动Java向前发展

介绍

在我看来,这篇文章提出了Java语言应该如何发展以保持其作为首选语言的地位。 它还提供了一些我喜欢但有时(可能永远不会)成为Java一部分的功能,由于我将要解释的某些原因,这些功能有时我已经爱上了。 我真的很想一天将其中一些想法转换为JSR。

在过去的15年中,Java语言和JVM得到了极大的改进。 JIT编译器,泛型的应用,自动装箱,很快(指尖)的lambda……所有这些功能都为Java的成功做出了贡献。 但是接下来呢? 如何使Java更好?

通过我的经验,我有机会使用几种编程语言。 其中包括C#,C / C ++,PHP,Javascript,Groovy,ActionScript 3,Scala等。在许多这些语言中,我发现了一些使我说“真棒!”的功能。 其中一些功能不适用于Java(不同的编程范例,不同的思维方式),而另一些则完全适用。 同样在其中一些语言中(主要是PHP),我看到了让我说“ OMG! 真是胡扯!”……但这是一个不同的故事!

在该系列的每一部分中,我将介绍一个Java中不存在的功能,并解释为什么它应该(或不应该)在Java中,可能要解决的问题,等等。

不要犹豫,发布改进的想法,甚至是最疯狂/不切实际的想法! 我并不假装自己有完美的解决方案,我只是尝试打开讨论。

属性访问器

在我看来,这篇文章提出了Java语言应该如何发展以保持其作为首选语言的地位。 它还提供了一些我喜欢但有时(可能永远不会)成为Java一部分的功能,由于我将要解释的某些原因,这些功能有时我已经爱上了。 我真的很想一天将其中一些想法转换为JSR。

通过透明访问器访问对象的字段绝对是我在Java中缺少的功能。

它是什么?

在Java中,我们使用getter和setter来访问对象的属性。 我不会说拥有getter和setter而不是拥有公共字段的好处,我假设您已经意识到……在其他语言(C#,AS3,…)中,您可以显式声明属性的getter和setter。就像使用公共财产一样使用它们。 我最喜欢的语法是一种ActionScript3:

//Object Declaration
public class MyObject {private var _myProperty:String;public function get myProperty():String {return _myProperty;}public function set myProperty(value:String):void {_myProperty = value;}public function get firstLetter():String {return _myProperty.substr(0,1);}
}//Usage
var o:MyObject = new MyObject();
o.myProperty = 'A value'; //Set the property using the setter
trace(o.myProperty); //Print the value return by the getter
trace(o.firstLetter); //Print 'A'


Java语法建议

由于我认为ActionScript 3语法非常方便,因此我认为Java语法应该非常相似。 这将需要添加新的修饰符 : getset

public class MyObject
{private String _name;public get String name() {return name;}public set void name(String name) {this.name = name;}
}//Usage
MyObject o = new MyObject();
o.name = 'My name';
System.out.println('print entity : ' + o.name);


好处

  • 使用访问器是透明的。 封装是隐式的。 调用者不知道它是在调用公共变量还是访问器。
  • 更好的OO风格编程:从外部类的角度来看,一个对象现在确实具有公共方法和属性,而以前只是公共方法。
  • 重构代码以更改对对象字段的所有直接访问实在是小菜一碟,您只需要更改相关的类即可,而不必更改所有的读/写调用。
  • 不再需要在getter和setter上使用JavaBean约定。 有些库依赖于myProperty器称为[get|is|set]MyProperty的事实。 现在,不再按约定定义承包人,而是按合同定义。 我们可以在Class上有一个方法来检索访问器(getGetters(),getSetters())。 再次,大大提高了OOP。


缺点

  • 由于方法和属性的名称可能相同,因此需要更改对象字段的命名约定。 毫无疑问,JVM可以允许属性和方法具有相同的名称,这更多是可读性问题。


实施与问题

要实现此功能,需要向Java语言添加两个新关键字( getset )。 对于追溯兼容性而言,这是一件坏事,但这并不是一个大问题。 在Java 1.4中添加assert关键字之前,将需要使用“ -source”命令行选项。

此更改还需要修改JVM规范,以及Java编译器,以添加两个新的修饰符。 在类文件中需要使用这两个新的修饰符,以便使用反射来标识类的getter和setter。

我相信此功能将对Java语言做出令人敬畏的改进。 作为所有重大改进,它需要大量工作。 如果有一天我有足够的时间提交JSR,那肯定是这一天!

线程安全编译检查

在我看来,这篇文章提出了Java语言应该如何发展以保持其作为首选语言的地位。 它还提供了一些我喜欢但有时(可能永远不会)成为Java一部分的功能,由于我将要解释的某些原因,这些功能有时我已经爱上了。 我真的很想一天将其中一些想法转换为JSR。

线程安全编译检查:这是什么?

它可以检查您的程序是否不会由于多线程而出现问题。 据我所知,没有一种编程语言提供此功能(如果您知道一种,请告诉我!)。

问题是什么?

开发在多个线程中运行的程序很容易,而开发不会有任何奇怪错误的东西,因为线程机制要困难得多。

为什么并发编程很难?

因为,要制作一个好的多线程应用程序,您必须非常小心并完全了解Java语言和API:避免出现死锁,知道何时使用volatile关键字,知道什么是(或不是)线程安全的。

另一个困难是测试/调试多线程应用程序非常困难。 您可能花了几天的时间想知道为什么在庞大的数据库中,您的行中有一个奇怪的日期值……最终要认识到您的共同开发者(当然不是您,因为您是Java专家 ;) )使用了多个线程共享的SimpleDateFormat对象……(顺便说一句,如果您不知道:是的,SimpleDateFormat不是线程安全的)

解决办法是什么?

线程安全编译检查! 如果有警告告诉您“在第36行:不是线程安全代码”,它将使开发变得更加容易。 使用非线程安全方法SimpleDateFormat.format”。

为什么不可能

非线程安全API的用法

目前,了解所使用的库/ API是否是线程安全的唯一方法是读取Javadoc或源代码。 因此,编译器无法知道您调用的是线程安全的还是不线程安全的。 通过可传递性,如果您不使用任何种类的同步机制,则由于使用这些库,因此无法知道您的代码是否是线程安全的。

解决此问题的一种方法是创建一个@ThreadSafe注释来注释类和方法。 这样,任何用@ThreadSafe注释的元素都将被编译器视为线程安全的。 当然,您使用的所有API都需要正确注释。除了进行编译检查之外,我认为这样的注释对于使API更加清晰非常有用。

反射API

Reflection API是另一个问题。 由于执行流程是在运行时期间确定的,因此编译器无法知道将调用哪些方法,因此无法确定将要执行的内容是否是线程安全的。

编译器需要了解上下文

编译器无法知道您正在开发的内容是否将在线程安全的环境中执行。 例如,如果您正在开发将由您最喜欢的CDI框架注入到各处的bean,则编译器无法知道它。

换句话说,编译器比您了解的少,因此无法确定您正在编程的内容是否需要线程安全。 假设您正在为J2EE应用程序编程控制器; 如果您不使用假设的@ThreadSafe注释对控制器进行注释,则编译器将永远不会抱怨。 问题是您的控制器必须是线程安全的! 如果您没有使用@ThreadSafe正确注释必须是线程安全的内容,那么您将遇到问题...

不同的锁机制

如果同步线程的唯一方法是synced关键字,则对于编译器而言,确定一段代码是否可以同时运行比较容易。 不幸的是,事实并非如此! 您有几种方法可以确保仅在正确的上下文中执行代码( ReentrantLock , ReadWriteLock ,使用文件,套接字,对象,计数器等的手动锁定)。 对我而言,这仅是导致“线程安全编译检查”无法实现的原因。 如果编译器无法发现同步机制,则它对线程安全一无所知!

结论

线程安全编译检查肯定是一个杀手级功能。 但是对我来说,甚至不可能部分实现,这也许就是为什么我从未在任何语言中看到过此功能的原因。

如果您对解决方案有任何想法,或者您知道某种解决方案的语言(甚至是部分语言),请告诉我!

参考: Java SE 11:Java向前推进-第1部分: Java SE 11:Java向前推进-第2部分:属性访问器 , Java SE 11:Java Java向前推进-第3部分:来自我们JCG合作伙伴 Tibo Delor的线程安全编译检查在InvalidCodeException博客上。

翻译自: https://www.javacodegeeks.com/2012/11/java-se-11-moving-java-forward.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/370973.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python之property属性

Property的概念:property是一种特殊的属性,访问它时会执行一段功能(函数),然后返回值。 import mathclass Circle:def __init__(self,radius):#园的半径radiusself.radiusradiusproperty#areaproperty(area)def area(s…

Hexo使用细节及各种问题

解决markdown图片不显示(返回403 forbidden)、添加本地图片无法显示、修改文章page模板、同时部署发布同步到多个仓库站点(Github、coding、gitee 码云) 图片不显示 在使用过程中,会发现有的引用图片无法显示的问题。但是如果直接复制图片地址到浏览器打开的话显示…

oracle的等保,Oracle等保测评相关指令

Oracle用户管理:SQL*Pluscreate user 用户名 identified by 密码; //创建用户grant 权限(dba管理员,resource普通用户,connect访客) to 用户名; //授权drop user 用户名 cascade; //删除用户,加cascade会把用户创建的所有东西删除Linux设置用…

Spring3 + JPA2 + Java EE6 App Server =配置混乱

Spring很棒,JavaEE6很棒,最新的JavaEE6 Application服务器也很棒。 这篇文章不是Spring Vs JavaEE6上的专栏文章,而是我在JBoss AS-7.1 App Server上移植Spring3 JPA2(Hibernate)应用程序的经验。 我的应用程序要求非…

python面向对象进阶(1)

面向对象进阶 isinstance(obj,cls) 检查是否obj是类cls的对象class Foo(object): passobj Foo() isinstance(obj,Foo)issubclass(sub,super) 检查sub是否是super的派生类class Foo(object): passclass Bar(Foo): passissubclass(Bar,Foo) 反射python面向对象中的反射&#xff…

智能小车37:异常在ARM、JAVA、硬件里的实现

几乎所有编程语言都有异常,可以说有程序就有异常。今天学习Arm的中断(异常)处理,联想到Java的异常,硬件中如何实现等问题,下面给大家分享一下。 一、Arm的中断。 1.触发异常 2.保存现场 3.cpu进入异常工作模式,程序指针(pc)跳入异常入口&…

c++builder提高批量动态创建panel的速度_骑行时影响速度的事项有哪些 怎样有效提高骑行速度 单车租赁信息...

撇开人的因素在自行车的组件中对车速影响最大的几项是什么?车重?自锁?轮组?传动?我的个人感受,从提高幅度上来讲,而不是重要性上来讲一、自锁起码提高你50%的速度,我不用自锁和别人一起走AVS25就很辛苦了,用了自锁&#xff0…

ansys matlab 调用,matlab 调用ansys (转载)

问题的提出:我们经常会需要用ansys计算一些东西,之后再用matlab来处理计算的结果。当修改某些参数重复上述过程的时候,就比较容易出现问题——比如ansys模型中的参数和matlab程序中参数的一致性问题等。这时可以考虑采用下面的协同工作的方法…

本地存储之sessionStorage

源码可以到GitHub上下载! sessionStorage: 关闭浏览器再打开将不保存数据 复制标签页会连同sessionStorage数据一同复制 复制链接地址打开网页不会复制seessionStorage内的数据 清除缓存加载当前页对页面无影响 1) 同源策略限制。若想在不同页面之间对同…

哈希三道题

两数之和 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。 你可以按任意…

zemax光学设计超级学习手册_穿越十年的一个ZEMAX光学设计案例

目前超过两千人的光学与光学设计方面的微信公众号,欢迎您!穿越十年的一个ZEMAX光学设计案例作者:窗台小绿萝CAD,这个词已经深入到学习、工作很多年,翻译过来就是Computer Aided Design,计算机辅助设计。随着…

Java本质和性能

最初的问题是如何计算二进制数中1的个数? 我包含了使用Integer.bitCount()的性能比较,该性能可以转换为固有特性,即单个机器代码指令POPCNT和执行相同功能的Java代码。 题 如何计算二进制数中1的个数? 假…

spring RequestMapping 包含http的部分以及各部分详解

RequestMapping有四个参数,分别为:1、value:表示请求URL2、method:表示请求方法3、params:表示请求参数4、headers:表示请求头 【例如】:RequestMapping(value"/testRequestMapping",…

【ZBH选讲·拍照】

【问题描述】 假设这是一个二次元。LYK召集了n个小伙伴一起来拍照。他们分别有自己的身高Hi和宽度Wi。为了放下这个照片并且每个小伙伴都完整的露出来,必须需要一个宽度为ΣWi,长度为max{Hi}的相框。(因为不能叠罗汉)。LYK为了节省…

php基础是什么,php基础学什么?

有不少同学想要学习 PHP,但又不清楚 PHP 基础学什么,那么这篇文章告诉你。熟悉前端开发语言学习 PHP 之前,首先要学习前端语言包括 HTML、CSS、JS 等。等对前端语言有个大致掌握后,能编写一个 web 静态页面。学习 PHP 基本语法和函…

名为 cursor_jinserted 的游标不存在_生鲜电商存在的问题及对策解析:未来生鲜电商如何发展?...

生鲜电商的特点有哪些?生鲜电商特点:1,生鲜电商具有粘性高、重复购买率高、毛利高的“三高”特性;2,生鲜食品需要保鲜、冷藏、冷冻;3,生鲜食品保质期比较短;保存不易、对物流配送的条件要求极高;4,生鲜商品…

遇到短信轰炸,别人换ip调你的短信接口怎么办

前端开发者很容易暴露自己的请求地址和参数,我们都知道,一个h5页面,按 F12 是可以看到页面的源码的,所以经常很多人会利用这一点恶意调取别人的接口。 我们公司出现了好多次短信接口被大量调用,导致一天发了几万条短信…

UVa 10170 - The Hotel with Infinite Rooms

题目:求从s開始的递增序列(每次加1)。求出他们加和不小于D的那个最后的加数。 分析:数学题。分治。s s1 ... n n*(n1)/2 - s*(s-1)/2 (ns)*(…

番石榴函数和Java 8 Lambdas

我最近阅读了Brian Goetz的《 Lambda的状况》 ,在阅读了该文章之后,我想尝试使用Java 8 Lambda表达式。 Brian在他的文章中继续描述了将一种方法称为“功能”接口的接口。 功能接口几乎总是用作匿名类,其中ActionListener是规范示例。 这些“…

linux rsync删文件速度,为什么用rsync删除大量文件的时候比用rm快

为什么用rsync删除大量文件的时候比用rm快今天研究怎么在Linux下快速删除大量文件,搜到很多人都说可以用rsync来删除大量文件,速度比rm要快很多,但是没有人说为什么,仔细研究了一下原因,总结起来大概就是,一…