在java编程中使用String被认为是邪恶的?

时间:2012-04-18 17:42:41

标签: java string

我试图了解在编程过程中使用String是否有用,我们小组中普遍认为使用String是不好的做法,而enum是可行的方法我无法找到足够的理由在我的投票中反对String,并会对这个问题的任何想法和例子表示感谢?

更新

我应该重新说出我的问题,比如在String的使用情况是什么情况下是邪恶的,以及你应该使用哪种替代dataType

6 个答案:

答案 0 :(得分:8)

String非常有用,是表示文本数据的最佳方式。字符串应用于表示:

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

答案 1 :(得分:2)

如果你问是否

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

优于

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

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

答案 2 :(得分: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

  • 连接字符串时,您应该使用StringBuilder,因为java.lang.String是不可变的,并为每个连接创建新副本。

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

答案 3 :(得分:0)

使用String的一个不幸的方面是,在JDK 7之前,它不适用于switch...case语句;您必须(如果为此目的使用String)使用if...else if...else代替。而且您必须使用.equals()而不是==进行测试,在某些情况下,您可能需要使用.equalsIgnoreCase()。对于这种情况,所有这些都让我倾向于enumString

答案 4 :(得分:0)

这取决于。不要忘记并且假设这个清单并非详尽无遗。

优点:
Java SE 7: String - String类是不可变的,因此可以共享字符串(这也意味着线程安全) String pool in Java - 汇总字符串,以便在重复使用时有效。

缺点: 将+用于多个字符串时,Concat操作效率不高。 最好使用StringBuilderStringBuffer(线程安全)或Ropes。 请参阅:IBM: Ropes

答案 5 :(得分:0)

字符串本身并不邪恶。

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

在这些情况下,更好的解决方案是将属于一起的数据项封装成合理的对象。