我试图了解在编程过程中使用String
是否有用,我们小组中普遍认为使用String
是不好的做法,而enum
是可行的方法我无法找到足够的理由在我的投票中反对String
,并会对这个问题的任何想法和例子表示感谢?
更新
我应该重新说出我的问题,比如在String
的使用情况是什么情况下是邪恶的,以及你应该使用哪种替代dataType
。
答案 0 :(得分:8)
String
非常有用,是表示文本数据的最佳方式。字符串应不用于表示:
enum
)。例如。没有"cm"
,"mm"
,"km"
作为单位。对这些元素使用Unit
枚举。 Unit.cm
等等。int
,double
等)Date
,Calendar
或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中最常用的类(免责声明:我没有数据支持它)。但是,有一些注意事项:
将密码收集并存储在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()
。对于这种情况,所有这些都让我倾向于enum
到String
。
答案 4 :(得分:0)
这取决于。不要忘记并且假设这个清单并非详尽无遗。
优点:
Java SE 7: String - String类是不可变的,因此可以共享字符串(这也意味着线程安全)
String pool in Java - 汇总字符串,以便在重复使用时有效。
缺点:
将+
用于多个字符串时,Concat操作效率不高。
最好使用StringBuilder
或StringBuffer
(线程安全)或Ropes
。
请参阅:IBM: Ropes
答案 5 :(得分:0)
字符串本身并不邪恶。
我认为当你将它用作主要抽象时会带来伤害。你可以在代码中看到它,它有许多明显相关的原语(例如字符串,整数,数组,数据结构),但它们分散在整个代码中。
在这些情况下,更好的解决方案是将属于一起的数据项封装成合理的对象。