Java 变得更好的五个特性

位置:首页>文章>详情   分类: Java教程 > 编程技术   阅读(144)   2024-03-31 06:21:31

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

Mike Judge 的白痴 (2006)

全局变量。 Java中有Singletons,众所周知,就是全局变量。在 Java 中启用全局变量并摆脱单例不是很好吗? 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。此外,当方法必须返回某些内容但没有return 语句时,Java 应该返回null。这几乎就是它在 PHP、Ruby 和许多其他语言中的工作方式。我相信这对于 Java monkeys 开发人员来说也是一个方便的功能。

当一些参数是可选的时,我们不需要定义那么多方法。 方法重载非常冗长且难以理解。相反,我们应该有一个带有一长串参数的方法。其中一些将由调用者提供,其他将设置为 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,这对于调用者来说是一个很好的指示器,表明有些地方不对,文件的内容不可用。

getter 和 setter

我认为我们需要这个特性是显而易见的:每个私有属性必须自动具有setter 和getter。应该不需要创建它们,Java 会开箱即用地提供它们,就像 Kotlin 和 Ruby 一样。如果没有 getter 和 setter 来读取和修改它,那么拥有一个属性有什么意义,对吗?

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

也许我应该把我的想法变成正式的提案给JCP。你怎么认为?

您可能还会发现这些相关的帖子很有趣:Each Private Static Method Is a Candidate for a New Class; 尝试。最后。如果。不是。为空。; 为什么 NULL 不好?; 为什么许多返回语句在 OOP 中不是一个好主意; 对象可以成为朋友吗?;

标签2: Java教程
地址:https://www.cundage.com/article/jcg-five-features-make-java-even-better.html

相关阅读

Java HashSet 教程展示了如何使用 Java HashSet 集合。 Java哈希集 HashSet 是一个不包含重复元素的集合。此类为基本操作(添加、删除、包含和大小)提供恒定时间性...
SpringApplicationBuilder 教程展示了如何使用 SpringApplicationBuilder 创建一个简单的 Spring Boot 应用程序。 春天 是用于创建企业应...
通道是继 buffers 之后 java.nio 的第二个主要新增内容,我们在之前的教程中已经详细了解了这一点。通道提供与 I/O 服务的直接连接。 通道是一种在字节缓冲区和通道另一端的实体(通...
课程大纲 Elasticsearch 是一个基于 Lucene 的搜索引擎。它提供了一个分布式的、支持多租户的全文搜索引擎,带有 HTTP Web 界面和无模式的 JSON 文档。 Elasti...
解析器是强大的工具,使用 ANTLR 可以编写可用于多种不同语言的各种解析器。 在这个完整的教程中,我们将: 解释基础:什么是解析器,它可以用来做什么 查看如何设置 ANTLR 以便在 Java...
Java 是用于开发各种桌面应用程序、Web 应用程序和移动应用程序的最流行的编程语言之一。以下文章将帮助您快速熟悉 Java 语言,并迈向 API 和云开发等更复杂的概念。 1. Java语言...
Java中的继承是指子类继承或获取父类的所有非私有属性和行为的能力。继承是面向对象编程的四大支柱之一,用于提高层次结构中类之间的代码可重用性。 在本教程中,我们将了解 Java 支持的继承类型,...
Java Message Service 是一种支持正式通信的 API,称为 网络上计算机之间的消息传递。 JMS 为支持 Java 程序的标准消息协议和消息服务提供了一个通用接口。 JMS 提...
Java 项目中的一项常见任务是将日期格式化或解析为字符串,反之亦然。解析日期意味着你有一个代表日期的字符串,例如“2017-08-3”,你想把它转换成一个代表 Java 中日期的对象,例如Ja...
之前,我介绍了spring 3 + hibernate 集成 示例和struts 2 hello world 示例。在本教程中,我将讨论在将 spring 框架与 struts 与 hibern...