0

我试图了解String在编程过程中使用它是否有用,我们小组中普遍认为使用String是不好的做法并且enum是可行的方法,但我无法找到足够的理由投反对票String并且不胜感激关于这个问题的想法和例子?

更新:

我应该将我的问题重新表述为在什么情况下使用String是邪恶的,以及dataType你应该使用什么替代方法。

4

6 回答 6

8

String是有用的,也是表示文本数据的最佳方式。不应使用字符串来表示:

  • 可枚举的相关常量(使用enum)。例如 no "cm", "mm","km"作为单位。对这些元素使用Unit枚举。Unit.cm, ETC。
  • 数字(使用int,double等)
  • 日期(使用DateCalendar或 joda-time DateTime
  • 密码 -char[]改为使用,因为 JVM 对字符串的处理方式不同,并且攻击者可能会访问敏感信息。
  • 二进制内容。如果您有 a byte[],则不应使用 anew String(bytes)来传输它 - 您可以通过这种方式丢失信息。字符串可以表示二进制内容,如果它被编码 - 在 Base64、Hex 等中。
于 2012-04-18T17:46:23.273 回答
2

如果你问是否

...
public enum Settings {
    FAST,SLOW,PRECISE
}
...
if(setting == Settings.FAST) {
...
}

好于

...
if("FAST".equals(setting)) {
...
}
...

那么答案是肯定的,枚举更好,因为您可以与 == 而不是 .equals() 进行比较,这可能会使可执行文件更快并且更容易编写,而且您可以使用 switch where 字符串值你不能,并且使用 enum如果您检查的是字符串值而不是枚举标志,您可以利用像 NetBeans 或 Eclipse 这样的优秀 IDE 来帮助您避免通过 IDE 和编译器的拼写错误。

于 2012-04-18T17:55:42.060 回答
1

java.lang.String不是邪恶的。事实上,它可能是 java 中最常用的类(免责声明:我没有数据支持它)。但是,有一些注意事项:

  • 加密货币。在处理加密密码时,有一个实例应该优先使用 char 数组而不是字符串:

将密码收集并存储在 java.lang.String 类型的对象中似乎是合乎逻辑的。但是,需要注意的是:String 类型的对象是不可变的,即没有定义允许您在使用后更改(覆盖)或清零 String 内容的方法。此功能使 String 对象不适合存储用户密码等安全敏感信息。您应该始终将安全敏感信息收集并存储在 char 数组中。

-- http://docs.oracle.com/javase/1.4.2/docs/guide/security/jce/JCERefGuide.html#PBEEx

  • 连接字符串时,您可能应该使用StringBuildersince java.lang.Stringis immutable 并且为每个连接制作新副本。

  • 当存在更专业的类时,例如枚举、数字、日期等,比字符串更喜欢它。

于 2012-04-18T17:49:24.553 回答
0

使用的一个不幸方面String是,在 JDK 7 之前,它不能在switch...case语句中工作。您必须(如果String为此目的使用 s)if...else if...else改为使用。并且您必须使用.equals()而不是进行测试==,并且在某些情况下您可能希望使用.equalsIgnoreCase()替代。所有这些都使我更喜欢enum这种String情况。

于 2012-04-18T17:49:51.230 回答
0

这取决于。出乎意料并假设此列表并不详尽。

优点:
Java SE 7:String - String 类是不可变的,因此可以共享字符串(这也意味着线程安全)。
Java 中的字符串池- 字符串被池化,因此在重用它们时很有效。

+缺点:用于多个字符串时,Concat 操作效率不高。最好使用 a StringBuilderor a StringBuffer(thread-safe) or Ropes. 看到这个:IBM:绳索

于 2012-04-18T17:56:37.843 回答
0

字符串本身并不邪恶。

我认为当你使用它作为你的主要抽象时,伤害就来了。您可以在代码中看到它,其中有许多明显相关但分散在整个代码中的原语(例如字符串、整数、数组、数据结构)。

在这些情况下,更好的解决方案是将一起属于的数据项封装到一个可感知的对象中。

于 2012-04-18T18:32:21.613 回答