Java:valueOf 与 copyValueOf
Java: valueOf vs copyValueOf
valueOf
和 copyValueOf
有什么区别。我查看了 GrepCode,却发现 return 和 完全 是同一回事。
copyValueOf:
Parameters:
data the character array.
Returns:
a String that contains the characters of the character array.
public static String copyValueOf(char data[]) {
return new String(data);
}
valueOf:
Returns the string representation of the char array argument. The contents of the character array are copied; subsequent modification of the character array does not affect the returned string.
Parameters: data the character array.
Returns:
a String that contains the characters of the character array.
public static String valueOf(char data[]) {
return new String(data);
}
所以如果两者做同样的事情,那为什么没有弃用一个呢?
A program element annotated @Deprecated is one that programmers are discouraged from using, typically because it is dangerous, or because a better alternative exists. Compilers warn when a deprecated program element is used or overridden in non-deprecated code (Annotation Type Deprecated).
这两种方法实际上做同样的事情;这意味着这两种方法都不危险或更好。这也许是他们懒得弃用这两种方法的原因。
这两种方法的目的相同,但它们的内部实现略有不同(根据 String.java
中的评论 - 较旧的实现):
copyValueOf(char data[])
Returns 与指定字符数组等效的字符串。它创建一个新数组并将字符复制到其中。
valueOf(char data[])
Returns 与指定字符数组等效的字符串。使用原始数组作为字符串的主体(即它不
将其复制到一个新数组)。
旧版本的代码冗余。但在 Java 的较新版本中,实现方式相同。旧方法可用,以便不了解新版本的老程序员可以使用它。
正如其他人指出的那样:
- 两种方法是等价的。
- javadoc 明确指出这两种方法是等效的。
copyValueOf
清楚地将 reader 指向(温和地)首选的 valueOf
方法。
- 两个版本之间没有性能差异。实现方式相同。
- 弃用一种或另一种方法会适得其反,因为它会促使人们“修复”未损坏的代码。那(可以说)是在浪费时间,而且会惹恼很多人。
- 删除一种或其他方法会破坏向后兼容性...没有充分理由。那会真的惹恼很多人。
唯一的另一个问题是为什么没有注释将方法标记为“过时”。我认为答案是,使用过时的 API 方法并不重要。当然,Java 团队实施这样的机制并不重要......然后花费大量时间来决定某某 API 是否“已经过时了” " 以保证标记等
(大多数人不希望 Java 团队在这些事情上浪费他们的时间。我们更希望他们花时间对 Java 进行改进,这将对 Java 产生真正的影响程序性能和程序员生产力。)
处理这个问题的更合适的方法是让某人编写或增强 3rd-party 样式检查器或错误检查器工具来标记(所谓的)过时方法的使用。这显然不是 Oracle 的问题,但如果您(亲爱的 Reader)真的很关心这个问题,您可以把它变成 您的 问题。
valueOf
和 copyValueOf
有什么区别。我查看了 GrepCode,却发现 return 和 完全 是同一回事。
copyValueOf:
Parameters: data the character array.
Returns: a String that contains the characters of the character array.
public static String copyValueOf(char data[]) { return new String(data); }
valueOf:
Returns the string representation of the char array argument. The contents of the character array are copied; subsequent modification of the character array does not affect the returned string.
Parameters: data the character array.
Returns: a String that contains the characters of the character array.
public static String valueOf(char data[]) { return new String(data); }
所以如果两者做同样的事情,那为什么没有弃用一个呢?
A program element annotated @Deprecated is one that programmers are discouraged from using, typically because it is dangerous, or because a better alternative exists. Compilers warn when a deprecated program element is used or overridden in non-deprecated code (Annotation Type Deprecated).
这两种方法实际上做同样的事情;这意味着这两种方法都不危险或更好。这也许是他们懒得弃用这两种方法的原因。
这两种方法的目的相同,但它们的内部实现略有不同(根据 String.java
中的评论 - 较旧的实现):
copyValueOf(char data[])
Returns 与指定字符数组等效的字符串。它创建一个新数组并将字符复制到其中。
valueOf(char data[])
Returns 与指定字符数组等效的字符串。使用原始数组作为字符串的主体(即它不 将其复制到一个新数组)。
旧版本的代码冗余。但在 Java 的较新版本中,实现方式相同。旧方法可用,以便不了解新版本的老程序员可以使用它。
正如其他人指出的那样:
- 两种方法是等价的。
- javadoc 明确指出这两种方法是等效的。
copyValueOf
清楚地将 reader 指向(温和地)首选的valueOf
方法。 - 两个版本之间没有性能差异。实现方式相同。
- 弃用一种或另一种方法会适得其反,因为它会促使人们“修复”未损坏的代码。那(可以说)是在浪费时间,而且会惹恼很多人。
- 删除一种或其他方法会破坏向后兼容性...没有充分理由。那会真的惹恼很多人。
唯一的另一个问题是为什么没有注释将方法标记为“过时”。我认为答案是,使用过时的 API 方法并不重要。当然,Java 团队实施这样的机制并不重要......然后花费大量时间来决定某某 API 是否“已经过时了” " 以保证标记等
(大多数人不希望 Java 团队在这些事情上浪费他们的时间。我们更希望他们花时间对 Java 进行改进,这将对 Java 产生真正的影响程序性能和程序员生产力。)
处理这个问题的更合适的方法是让某人编写或增强 3rd-party 样式检查器或错误检查器工具来标记(所谓的)过时方法的使用。这显然不是 Oracle 的问题,但如果您(亲爱的 Reader)真的很关心这个问题,您可以把它变成 您的 问题。