java更好的语言_五个使Java变得更好的功能

java更好的语言

我偶然发现了Brian Goetz 提出的有关Java数据类的建议 ,立即意识到我也对如何使Java更好地成为一种语言有一些想法。 我实际上有很多,但这只是五个最重要的简短列表。

专制(2006),迈克·贾奇(Mike Judge)

全局变量 。 Java中有Singleton ,众所周知,它只是全局变量 。 在Java中启用全局变量并摆脱Singletons,不是很好。 PHP,JavaScript,Ruby和许多其他语言都有它们,为什么Java没有? 看下面的代码:

class User {private static final User INSTANCE;private User() {}public static User getInstance() {synchronized (User.INSTANCE) {if (User.INSTANCE == null) {User.INSTANCE = new User();}}return User.INSTANCE;}public String getName() {// return user's name}
}

然后,要访问它,我们必须使用:

String name = User.getInstance().getName();

这是一个单例。 看到它多么冗长吗? 我们可以简单地将其替换为全局变量( global是我建议使用的关键字):

global User user;

然后:

user.getName();

更少的代码编写,更容易阅读!

全局函数和命名空间

为了将静态方法组合在一起,我们创建了工具类 ,在其中我们必须定义私有构造函数以防止实例化。 同样,我们必须记住静态方法位于哪个特定的实用程序类中。这只是额外的麻烦。 我建议我们将全局函数添加到Java和可选的“命名空间”中以对它们进行分组。 看一下这个实用程序类:

class TextUtils {private TextUtils() {}public static String trim(String text) {if (text == null) {return "";}return text.trim();}
}

现在使用命名空间查看此全局函数:

namespace TextUtils {String trim(String text) {if (text == null) {return "";}return text.trim();}
}

我的观点是,由于我们已经在使用类作为函数的集合,因此让我们更加方便。 在某些应用程序中,我们甚至不需要名称空间,而只需要全局函数,例如C和C ++。

完全访问私有属性和方法

为了从外部访问私有属性或对象的方法,我们必须使用Reflection API 。 这并不是特别困难,但是确实需要几行代码,而这些代码并不容易阅读和理解:

class Point {private int x;private int y;
}
Point point = new Point();
Field field = point.getClass().getDeclaredField("x");
field.setAccessible(true);
int x = (int) field.get(point);

我建议我们允许任何对象访问另一个对象的任何属性和方法:

Point point = new Point();
int x = point.x;

当然,如果它们是私有的,则编译器将发出警告。 在编译时,您只需忽略警告并继续。 如果您真的很关心封装,请注意警告并采取其他措施。 但是在大多数情况下,程序员会忽略它,因为他们无论如何都会愉快地使用Reflection API。

默认为NULL

让我们使用一组不完整的参数来调用构造函数和方法会很方便。 默认情况下,我们不提供的参数将设置为null 。 另外,当方法必须返回某些内容但没有return语句时,Java应该返回null 。 这几乎完全是它在PHP,Ruby和许多其他语言中的工作方式。 我相信这将是Java的便捷功能

猴子
开发人员也是如此。

当某些参数是可选的时,我们不需要定义太多方法。 方法重载非常冗长且难以理解。 相反,我们应该有一个带有一长串参数的方法。 其中一些将由调用方提供,其他一些将被设置为null 。 该方法将决定要做什么,例如:

void save(File file, String encoding) {if (encoding == null) {encoding = "UTF-8";}
}

然后,我们只调用save(f)save(f, "UTF-16") 。 该方法将理解我们的意思。 我们还可以使其更加方便,就像在Ruby中一样,通过名称提供方法参数:

save(file: f, encoding: "UTF-16");

同样,当没有任何要返回的内容时,默认情况下该方法必须返回null 。 编写return null只是浪费代码行,并不能真正提高可读性。 看一看:

String load(File file) {if (file.exists()) {return read_the_content();}
}

从此代码显而易见,如果文件存在,则该方法将加载并返回其内容。 如果不是,它将返回null ,这将为调用者提供一个很好的指示,表明某些错误和文件内容不可用。

吸气剂和二传手

我认为这很明显是我们需要此功能的:每个私有属性都必须自动具有setter和getter 。 无需创建它们,Java将像Kotlin和Ruby一样提供现成的它们。 如果没有getter和setter方法来读取和修改它,那么拥有一个属性有什么意义呢?

有了这项新功能,我们将不再需要Lombok或IntelliJ IDEA的帮助。

也许我应该把我的想法变成对JCP的正式建议。 你怎么看?

您可能还会发现这些相关的帖子很有趣: 每个私有静态方法都是新类的候选人 ; 尝试。 最后。 如果。 不。 空值。 ; 为什么NULL是错误的? ; 为什么在OOP中很多退货声明是个坏主意 ; 对象可以成为朋友吗? ;

翻译自: https://www.javacodegeeks.com/2017/11/five-features-make-java-even-better.html

java更好的语言

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

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

相关文章

Linux 初始化系统(系统服务管理和控制程序/Init System) -- System V init(SysV init) 的简单理解

文章目录SysV init 简介SysV init 的缺点运行级别主要文件和目录的截图SysV init 简介 System V init(缩写 SysV init)是类 Unix 操作系统中传统的也是首款初始化系统。 服务配置文件(bash 脚本文件)存放在目录 /etc/init.d 下 …

java使用缓冲区读取文件_在Java中使用Google的协议缓冲区

java使用缓冲区读取文件最近发布了 有效的Java第三版 ,我一直对确定此类Java开发书籍的更新感兴趣,该书籍的最新版本仅通过Java 6进行了介绍 。 在此版本中,显然存在与Java 7 , Java 8和Java 9密切相关的全新项目,例如…

linux多用户运行同一程序_linux系统中CentOS有哪些优势,让它长盛不衰?

CentOS是目前评价和口碑都不错的linux系统,甚至很多公司安装的都是CentOS系统,对于初入门的小白可能不了解这个系统,今天我们就整理一下CentOS系统的七大优势。1. 开源、免费众所周知,不管是微软的 Windows 还是苹果的 macOS&…

浅析 Linux 初始化系统(系统服务管理和控制程序/init system) -- UpStart

文章目录一、Upstart 简介(一)开发 Upstart 的缘由(二)Upstart 的特点二、Upstart 概念和术语(一)Job(二)Job 生命周期(三)事件 Event1.Signals2.Methods3.Ho…

telnet到设备里 php_金融行业思科设备典型网络故障案例:76系列典型案例(一)...

一、Cisco 7606主备引擎自动切换01故障现象某行上联路由器cisco7606 x月x日引擎自行切换,这种情况是第一次发生,至今仍是备引擎是active,主引擎是standby。02分析过程思科TAC提取了log日志和crashinfo信息:Previous engine detect…

白盒测试方法静态分析_静态分析的教育方面

白盒测试方法静态分析加入我们项目的新程序员经常问我们是否有自动格式化工具,以使Java代码看起来完全像Qulice期望的那样。 (Quili是我们使用的静态分析器。)我总是回答说,拥有这样一个自动代码抛光器只会有害,并且不…

java javadoc_使用Java 9向Javadoc搜索添加术语

java javadoc有一个相对较旧的网页,称为“ Proposed Javadoc Tags ”,最初似乎是与Javadoc 1.2一起编写的,其中列出了“ Sun有朝一日可能会在Javadoc中实现的标签”。 在此列表中的标签是category , example , tutoria…

浅析 Linux 初始化系统(系统服务管理和控制程序/Init System) -- systemd

文章目录一、Systemd 的简介和特点(一)同 SysVinit 和 LSB init scripts 兼容(二)更快的启动速度(三)systemd 提供按需启动能力(四)Systemd 采用 Linux 的 Cgroup 特性跟踪和管理进程…

查询 service monitor 时发生内部错误_通过Service访问应用 (1)

目录通过Service访问应用通过Pod IP访问应用 通过ClusterIP Service在集群内部访问 通过Service访问应用通过之前的操作,应用部署完成了,我们的Demo网站已经成功启动了,那么如何访问网站呢?通过Pod IP访问应用我们可以通过Pod IP来…

c语言 方程改main的值_C语言编程笔记丨编写第一个C语言程序hello world,我教你哇...

如果用C语言输出:Hello,world!,该如何编写程序?**代码如下:**#include//包含标准库的信息main()//定义名为main的函数,不接受参数值{//main函数的语句都放在花括号中,也表示函数体的…

linux定时创建文件,linux下如何创建定时任务

文/PM回忆录本篇文章不详细讲述cron服务的那种配置文件,只是应用层面的讲解,只求初步的掌握。说到定时任务,不能不介绍下cron:一、cron定时任务是什么在LINUX中,周期执行的任务一般由cron这个守护进程来处理[ps -ef|gr…

6-7 使用函数输出水仙花数_「Java」再议printf函数

System.out.printf() 是在JDK1.5版开始引入的方法,即在JDK1.5以后的版本才可以使用此函数,printf 方法有 printf(String format, Object ... args) 和 printf(Locale l, String format, Object ... args) 两种重载方式。其实学过C语言的小伙伴应该会觉得…

c语言命名规则_C语言的基本数据类型及变量

学习目标了解C语言的基本数据类型了解变量的基本概念了解变量的使用方法了解了变量的命名方法了解格式占位符了解变量的输出了解C语言程序的基本数据类型及概念的使用方法擦在C语言编程中,系统定义了多种数据类型,本节将讲解基本数据类型的分类。基本数据…

Linux 常用的软件包管理器/软件包管理工具详解

文章目录RPM 是什么?应用于哪些系统RPM 的前端工具有哪些RPM 包命名规范RPM 安装软件的默认路径RPM 安装原理图RPM 命令详解YUM 是什么?应用于哪些系统YUM 原理说明主要特点YUM 和 RPM 的区别YUM 命令详解DNF 是什么应用于哪些系统DNF 命令详解APT 是什么…

java world_Java World中的GraphQL简介

java world许多人认为GraphQL仅适用于前端和JavaScript,它在Java等后端技术中不占优势,但事实确实如此。 还经常将GraphQL与REST进行比较,但是这种比较是否合理? 首先,让我开始回答其中最重要的问题。 什么是GraphQL…

快速排序 动图_Java十大排序算法最强总结

看到一篇很不错的文章,不多说,看吧排序算法说明0.1 排序的定义对一序列对象根据某个关键字进行排序。0.2 术语说明稳定:如果a原本在b前面,而ab,排序之后a仍然在b的前面;不稳定:如果a原本在b的前…

feignclient注解使用_从 Feign 使用注意点到 RESTFUL 接口设计规范

最近项目中大量使用了Spring Cloud Feign来对接http接口,踩了不少坑,也产生了一些对RESTFUL接口设计的想法,特此一篇记录下。SpringMVC的请求参数绑定机制了解Feign历史的朋友会知道,Feign本身是Netflix的产品,Spring …

python写接口测试代码_python写运单接口测试(增改查)完整代码

importrequestsimportjsonfrom urllib importparseclassHttpWayBillRquest:运单的增改查 defaccess_token(self):获取tokenurl http://xxxxxxxxx.comusername 12333password 12334566res_json requests.get(url, auth(username, password)).json()print(access_token的结果为&a…

linux vim自动执行快捷键,Linux Vim快捷键操作命令整理

VIM中常用的替换模式总结1,简单替换表达式替换命令可以在全文中用一个单词替换另一个单词::%s/four/4/g“%” 范围前缀表示在所有行中执行替换。最后的 “g” 标记表示替换行中的所有匹配点。如果仅仅对当前行进行操作,那么只要去掉%即可如果…

eclipse占用内存过大_Java性能调优学习(三)-jmap+mat分析内存溢出问题实战

上一节我们讲了jinfo,jstat,jmap的使用,还简单的讲了下如何使用jmap导出内存映像文件,这次,我们来实战一把内存溢出问题。环境准备首先我们先模拟一下内存溢出的场景,以下这段代码在访问后肯定会造成堆内存…