我的数据库有一个静态字符串类,因此我总是以他们设计的方式拼写表格和列。
我目前在这一个类中有大约500行代码,但这是一个简短的例子:
public const string PURCHASING = "PURCHASING";
public const string SCHED_PURCH = "SCHED/PURCH";
public const string SCHEDULING = "SCHEDULING";
要创建“Clerk”部门的 readonly 静态字符串数组,我使用此静态声明:
public static string[] CLERK_DEPT {
get {
return new string[] { PURCHASING, SCHEDULING, SCHED_PURCH };
}
}
我的数据库字符串类中有很多这样的代码。
今天,我发现这个活跃的帖子中有人做了非常相似的事情:
How do I prevent the modification of a private field in a class?
答案提供了一种方法来提供我以前没有考虑过的只读字符串数组:
您必须返回阵列的副本。
public String[] getArr() {
return arr == null ? null : Arrays.copyOf(arr, arr.length);
}
现在我想知道是否有人在这里知道一种更有效的方法来传回我的readonly字符串数组。
我必须承认,我一直憎恶我的代码中return new string[]
的想法。
那么,有吗? ...一种更有效,更清洁的方法,或者我已经创建了最佳解决方案?
答案 0 :(得分:6)
基本上没有不可变数组这样的东西。
如果您信任所有来电者,可以告诉他们不要改变数组。另一种方法是提供只读包装器:
private static readonly ReadOnlyCollection<string> clerkDepartments =
new ReadOnlyCollection<string>(
new[] { "PURCHASING", "SCHED/PURCH", "SCHEDULING" });
public static readonly ReadOnlyCollection<string> ClerkDepartments
{ get { return clerkDepartments; } }
请注意,尽管ReadOnlyCollection<T>
不是完全不可变集合,但只有访问底层集合的代码才能更改它 - 并且作为唯一“知道”数组的代码是初始化器,它将它传递给构造函数,除非有人破解反射,否则你基本上是安全的。)
答案 1 :(得分:3)
也许使用ReadOnlyCollection?