问题
字符串在实际开发中被高频使用,同样也存在着被滥用的情况,那么,字符串不应该使用在哪些情形下呢?
解决
字符串不适合代替其他值的类型:当原始类型为int、float等其他类型时,就不要使用字符串替代;
字符串不适合代替枚举类型:枚举类型比字符串更适合用来表示枚举的常量;
字符串不适合代替聚集类型:如果一个实体有多个组件,用字符串来表示这个实体通常不恰当,
String compundKey = className + "#" + i.next()
,更好的做法是编写一个类来描述这个数据集,通常是一个私有的静态成员类;字符串不适合作为授权键:有时候,字符串被用于对某种功能进行授权访问,考虑设计一个提供线程局部变量的机制,这个机制提供的变量在每个线程中都有自己的值,示例代码:
public class ThreadLocal { private ThreadLocal() {} public static void set(String key, Object value); public static Object get(String key); }
这种方法的问题在于,字符串键代表一个共享的全局命名空间,要使这种办法可行,客户端提供的字符串必须是唯一的,如果使用了相同的字符串,实际上就共享了这个变量。可以采用以下这种方式进行修正:
public class ThreadLocal { private ThreadLocal() {} public static class Key { Key() {} } public static Key getKey() { return new Key(); } public static void set(Key key, Object value); public static Object get(Key key); }
这种采用对象实例作为授权键的话,就能够保证全局唯一。事实上,ThreadLocal也是采用这种方式,将ThreadLocal实例作为了ThreadLocalMap的键。
结论
总之,如果可以使用更加合适的数据类型,或者可以编写更加适当的数据类型,就应该避免使用字符串来表示对象。如果使用不当,字符串会比其他类型更加笨拙、速度更慢。字符串经常被错误的用来替代基本类型、枚举类型。