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