0

我的数据库有一个静态字符串类,所以我总是按照他们设计的方式拼写表格和列。

我目前在这一类中有大约 500 行代码,但这里有一个简短的示例:

public const string PURCHASING = "PURCHASING";
public const string SCHED_PURCH = "SCHED/PURCH";
public const string SCHEDULING = "SCHEDULING";

为了创建“职员”部门的只读静态字符串数组,我使用了这个静态声明:

public static string[] CLERK_DEPT {
  get {
    return new string[] { PURCHASING, SCHEDULING, SCHED_PURCH };
  }
}

在我的数据库字符串类中有很多这样的代码行。

今天,我偶然发现了这个活跃的帖子,其中有人在做非常相似的事情:

如何防止修改类中的私有字段?

那里的答案提供了一种方法来提供我以前没有考虑过的只读字符串数组:

您必须返回数组的副本

public String[] getArr() {
  return arr == null ? null : Arrays.copyOf(arr, arr.length);
}

这让我想知道这里是否有人知道一种更有效的方法来传回我的只读字符串数组。

我必须承认,我一直厌恶return new string[]我的代码中的想法。

那么,有吗?...一种更有效、更清洁的方法,还是我已经创建了最佳解决方案?

4

2 回答 2

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>它不是一个完全不可变的集合,但只有可以访问底层集合的代码才能更改它 - 因为唯一“知道”数组的代码是将它传递给构造函数的初始化程序,所以你基本上是安全的除非有人破解反射:)

于 2013-02-11T16:44:47.053 回答
3

也许使用 ReadOnlyCollection?

http://msdn.microsoft.com/en-us/library/ms132474.aspx

于 2013-02-11T16:43:21.383 回答