为什么';Java是否公开了一个基于toString/hashCode/equals的编译时反射?

为什么';Java是否公开了一个基于toString/hashCode/equals的编译时反射?,java,reflection,compilation,Java,Reflection,Compilation,如果我理解正确的话,如果Java能够为请求编译时反射的对象计算函数,那么除了实际的函数处理(toString/hashCode/equals)之外,应该不需要任何成本 对于向上/向下浇铸对象的情况,该行为仍然优于指针地址作为toString表示,这实际上是无用的 差不多 // Returns the compile time 'ReflectionToStringBuilder.toString(foo)' foo.tryToString() 我错过了什么 在回答评论时,我发现我的问题用词正确

如果我理解正确的话,如果Java能够为请求编译时反射的对象计算函数,那么除了实际的函数处理(toString/hashCode/equals)之外,应该不需要任何成本

对于向上/向下浇铸对象的情况,该行为仍然优于指针地址作为toString表示,这实际上是无用的

差不多

// Returns the compile time 'ReflectionToStringBuilder.toString(foo)'
foo.tryToString()
我错过了什么

在回答评论时,我发现我的问题用词正确

为什么我们必须将代码(/eclipse生成)交给字符串/hash/equals,而这本可以由Java编译器完成?

  • Java是一种非常保守的语言,20年后改变默认行为将改变现有程序。这是Java中通常尽可能避免的事情
  • 如果toString总是返回每个字段的值,那么它会打开一个程序,最多有两个风险:a)生成的字符串可能变得非常大,即垃圾邮件日志;b)由于循环引用或大数据而变得如此大,以至于它永远不会结束,并导致堆栈溢出或内存不足异常(通过增加额外的成本/复杂性,两者都可以避免)
  • 默认为散列并不是无用的,因为作为调试器中的默认行为,它提供了有关对象标识而不是相等的线索。对于某些类的错误非常有用
  • 某些字段可能包含敏感信息,如密码或信用卡号码。此类字段不应完整显示在日志中。(chrylis)
  • Java是一种非常保守的语言,在20年后改变默认行为将改变现有的程序。这是Java中通常尽可能避免的事情
  • 如果toString总是返回每个字段的值,那么它会打开一个程序,最多有两个风险:a)生成的字符串可能变得非常大,即垃圾邮件日志;b)由于循环引用或大数据而变得如此大,以至于它永远不会结束,并导致堆栈溢出或内存不足异常(通过增加额外的成本/复杂性,两者都可以避免)
  • 默认为散列并不是无用的,因为作为调试器中的默认行为,它提供了有关对象标识而不是相等的线索。对于某些类的错误非常有用
  • 某些字段可能包含敏感信息,如密码或信用卡号码。此类字段不应完整显示在日志中。(chrylis)

  • 您是否在问为什么Java不提供默认的
    toString()
    每个未显式提供构造函数的类的实现,类似于它如何为每个未提供构造函数的类提供默认的公共无参数构造函数?略有不同。没有参数的公共构造函数什么都不做。我在问为什么我们必须手工编写代码(eclipse生成)一个toString/hash/equals可以由Java编译器来完成。我认为没有好的答案,除此之外:当语言被发明时;没有人想到这一点。正如另一个答案所示:获得“默认值”并不容易正确的实现。如果你真的想让编译器为你做所有这些事情,请转向scala及其值类;-)@Jägermeister是的,我越来越接近于选择scala作为我的默认武器。:)@请注意完整性,以免他人误解您的评论。。scala默认情况下也不会在类上生成toString,必须将类声明为case类,然后根据字段声明的性质调整包含/排除哪些字段。但没错,Scala是一种不错的语言;)您是否在问为什么Java不为每个未显式提供的类提供默认的
    toString()
    实现,类似于它如何为每个未提供任何构造函数的类提供默认的公共无参数构造函数?差别不大。没有arg的公共构造函数不执行任何操作。我在问为什么我们必须手工编写(eclipse生成)一个toString/hash/equals,这本可以由Java编译器完成;没人想到这一点。正如另一个答案所示:要正确地实现“默认”实现并不容易。如果你真的希望编译器为你做所有这些事情;转向scala及其值类;-)@Jägermeister是的,我越来越接近将Scala作为我的默认武器@请注意完整性,以免他人误解您的评论。。scala默认情况下也不会在类上生成toString,必须将类声明为case类,然后根据字段声明的性质调整包含/排除哪些字段。但没错,Scala是一种不错的语言;)如果对象中有任何敏感信息,也存在安全风险。安全风险和默认行为问题可以通过使用类似于序列化程序的标记接口来解决@Chris K:难道你不认为我们已经看到(可能没有编写)更多的错误,因为默认的hashcode实现而不是基于相等的hashcode吗?如果对象中有任何敏感信息,也有安全风险。安全风险和默认行为问题可以通过使用类似于序列化器的标记接口来解决@Chris K:难道你不认为我们已经看到(可能没有写)更多的bug,因为默认的hashcode实现而不是基于等式的hashcode?