我偶然发现了 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
,这对于调用者来说是一个很好的指示器,表明有些地方不对,文件的内容不可用。
我认为我们需要这个特性是显而易见的:每个私有属性必须自动具有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