五个使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将像KotlinRuby一样提供现成的它们。 如果没有用于读取和修改它的getter和setter方法,那么拥有一个属性有什么意义呢?

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

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值