java java se_Java SE 11:推动Java前进

java java se

介绍

在我看来,这篇文章提出了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 ,使用文件,套接字,对象,计数器等的手动锁定)。 对我而言,这仅是导致“线程安全编译检查”无法实现的原因。 如果编译器无法发现同步机制,则它对线程安全一无所知!

结论

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

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

参考: 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

java java se

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

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

相关文章

用GDAL/OGR去读shapefile

一、读shapefile 1、首先,用Arcgis创建所要读的shp文件。打开ArcCatalog,右键NEW->Shapefile,名称Name:point ,要素类型(Feature Type):Point。点击Edit,选择投影类型。 2、打开ArcMap. 单击工具栏里的A…

【日 志】

/// <summary>/// 记录执行sql时的错误日志/// <para>cmdTxt 执行的sql</para>/// <para>inputParams 传入的Hashtable参数</para>/// </summary>private static void LogLastError(string cmdTxt, Hashtable inputParams){try{StringBuil…

php 数组移除指定健,php删除数组指定键的方法

php删除数组指定键的方法&#xff1a;首先创建一个PHP代码示例文件&#xff1b;然后定义一个“array_remove”方法&#xff1b;最后利用“array_key_exists”、“array_search”等函数实现删除数组指定键即可。PHP删除Array数组里指定的key/*** php除数组指定的key值(直接删除k…

Intellij IDEA社区版中的SpringBoot入门

我们可以使用Intellij IDEA社区版来处理SpringBoot应用程序&#xff0c;因为我们不需要配置Tomcat&#xff0c;Wildlfy等服务器&#xff0c;只需运行main&#xff08;&#xff09;方法即可运行应用程序。 但是&#xff0c;Intellij IDEA社区版中没有提供直接创建SpringBoot应用…

SpatialHadoop中空间索引系列之(四)空间格网索引实现

有关空间格网索引原理详见前面章节讲述的内容。这里我们根据SpatialHadoop中具体的实现&#xff0c;来详细讲解下。格网索引是一级索引&#xff0c;格网的个数取决于两个参数&#xff0c;一个是数据集的大小&#xff0c;另外一个就是格网的大小。那么在SpatialHadoop当中&#…

php导入csv文件,php实现CSV文件导入和导出

项目开发中&#xff0c;很多时候要将外部CSV文件导入到数据库中或者将数据导出为CSV文件&#xff0c;那么具体该如何实现呢&#xff1f;本文将使用PHP并结合mysql&#xff0c;实现了CSV格式数据的导入和导出功能。我们先准备mysql数据表&#xff0c;假设项目中有一张记录学生信…

剑指offer-二叉搜索树的后序遍历序列

/*输入一个整数数组&#xff0c;判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。*/ /** 已知条件&#xff1a;后序序列最后一个值为root&#xff1b;二叉搜索树左子树值都比root小&#xff0c;右子树值都…

Nessus漏洞扫描教程之安装Nessus工具

Nessus基础知识 Nessus号称是世界上最流行的漏洞扫描程序&#xff0c;全世界有超过75000个组织在使用它。该工具提供完整的电脑漏洞扫描服务&#xff0c;并随时更新其漏洞数据库。Nessus不同于传统的漏洞扫描软件&#xff0c;Nessus可同时在本机或远端上遥控&#xff0c;进行系…

php强制关机代码,程序员关机代码是什么?

程序员关机代码&#xff1a;1、定时关机&#xff0c;在运行中输入【at 22:00 Shutdown -s】&#xff1b;2、倒计时方式关机&#xff0c;在运行中输入【Shutdown.exe -s -t 3600】&#xff1b;3、自动关机&#xff0c;输入【shutdown -i】。程序员关机代码&#xff1a;1、比如你…

Java 9和应用程序性能监视的激动人心之处

通过AppDynamics解决应用程序问题的速度提高了10倍–以最小的开销在代码级深度监视生产应用程序。 开始免费试用&#xff01; 在当今的现代计算时代&#xff0c;软件创新的不断增强使我们更接近软件革命的时代。 也许在遥远的未来&#xff0c;这可能是对21世纪记忆犹新的方式。…

GPU下train 模型出现nan

When training on GPU, the error "Model diverged with loss NaN" is often caused by a sotmax thats getting a symbol larger than vocab_size 转载于:https://www.cnblogs.com/wuxiangli/p/10344259.html

php语言的四种循环控制语句,PHP循环控制语句

循环语句的作用就是在条件满足的情况下&#xff0c;可以执行多次相同或相似的任务&#xff0c;PHP中的循环语句包括for、while、do-while和foreach语句结构&#xff0c;下面分别介绍。for语句for语句结构一般用于执行确定循环次数的操作&#xff0c;其条件包括三个部分&#xf…

Kali linux安装漏洞扫描工具Nessus安装指南

引子&#xff1a;Nessus是著名信息安全服务公司tenable推出的一款漏洞扫描与分析软件&#xff0c;号称是"世界上最流行的漏洞扫描程序,全世界超过75,000个组织在使用它"。尽管这个扫描程序可以免费下载得到&#xff0c;但是要从Tenable更新到所有最新的威胁信息,每年…

7.9 规划Varnish缓存

./varnishlog -i VCL_LOG 转载于:https://www.cnblogs.com/likevin/p/10337069.html

php详解递归,PHP递归算法详解

本篇文章主要介绍PHP递归算法详解&#xff0c;感兴趣的朋友参考下&#xff0c;希望对大家有所帮助。遇到需要设计树节点的数据库结构&#xff0c;以及需要读出来的树节点数据结构&#xff01;大家是否会选择用数据库的查询方式来获取树结构呢&#xff1f;//曾经的数据库查询获取…

土城战役_避免使用FOR –反假战役

土城战役您是否想知道FOR如何影响您的代码&#xff1f; 他们如何限制您的设计&#xff0c;更重要的是如何将您的代码转换为无人为含义的多行代码&#xff1f; 在这篇文章中&#xff0c;我们将看到如何将for的简单示例&#xff08;由Francesco Cirillio提供- 反if活动&#xff…

Map以自定义类做为键值

map在STL中的定义 template <class Key, class T, class Compare less<Key>, class Alloc alloc> 第一个参数Key是关键字类型 第二个参数T是值类型 第三个参数Compare是比较函数&#xff08;仿函数&#xff09; 第四个参数是内存配置对象 map内部存储机制实际是以…

“基于深度学习的目标检测跟工业机器人结合”实现过程

基于深度学习的目标检测技术在工业机器人中的应用&#xff0c;可以帮助机器人实现自动化的目标检测和识别任务。以下是基于深度学习的目标检测与工业机器人结合的一般实现过程&#xff1a; 1. 数据采集和准备&#xff1a; 首先&#xff0c;收集和准备用于训练深度学习模型的数据…

小规模流处理kata。 第2部分:RxJava 1.x / 2.x

在第1部分&#xff1a;线程池中&#xff0c;我们设计并实现了相对简单的系统&#xff0c;用于实时处理事件。 确保您已阅读上一部分&#xff0c;因为它包含一些我们将重用的类。 以防万一这是要求&#xff1a; 一个系统每秒传送约一千个事件。 每个Event至少具有两个属性&…

java 计算信度,11.5.2 评分者信度实例分析

11.5.2 评分者信度实例分析【例11.5】 某校学生举办歌唱大赛&#xff0c;请5位评委老师为最终进入决赛的6名同学评定等级&#xff0c;结果如表11-10所示&#xff0c;请计算其信度。表11-10 歌唱大赛评定等级结果学生教师A1A2A3A4A5A6A344335B434343C233253D445344E324333解&a…