0

我有一个包含一堆控制数据的单例类,这些控制数据需要与我的应用程序的其余部分保持同步。结果,很多时候我希望另一个类能够读取信息但不能修改它。目前,这个单例类有很多公共变量。我不想使用 getter 和 setter 函数,因为它们冗长且烦人。此外,还有很多变数。

如果我的单例类称为 ControlData,我可以创建第二个创建第二个名为 ImmutableControlData 的类,它具有所有相同的成员,但它们被声明为 final。然后,在检索我的单例时,我将返回一个 ImmutableControlData,而不是一个 ControlData 对象。但是,这意味着我需要不断维护 ImmutableControlData 类以及 ControlData 类(烦人...)

如果我有 const 指针,我只会返回一个指向我的 ControlData 对象的 const 指针。相反,我可以用 Java 做什么?

4

3 回答 3

3

Java 不像 C++ 那样具有 const 正确性。

您可以创建一个接口来声明读取数据的方法,但不能声明修改数据的方法。让保存数据的类实现这个接口。程序中其他地方应该只读取数据的方法应该接受接口而不是类作为参数类型。例如:

public interface ReadablePerson {
    String getName();
}

public class Person implements ReadablePerson {
    private String name;

    @Override
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

// Elsewhere...
public void someMethod(ReadablePerson p) {
    System.out.println(p.getName());
}

当然,someMethod你仍然可以通过强制转换p来颠覆这一点Person,但至少它需要一些有意识的努力(添加强制转换),这应该提醒程序员他正在做他不应该做的事情。

此解决方案的一个优点是您不必制作数据的防御性副本。

于 2013-01-18T15:52:52.280 回答
0

第一:如果您的班级有这么多成员,您应该尝试将班级分成更小的班级。也许你可以总结一些变量,例如。

ControlflowVariables 状态变量

如果要限制对变量的访问,则必须使用 getter。IDE 可以为您创建 getter 和 setter。对变量的访问是一样的:

singletonClass.variable那时还不是最糟糕的singletonClass.getVariable()

如果您只想在代码中的某些点限制访问,请创建 tha 变量的最终副本

final int variable = singletonClass.getInstance().variable;
于 2013-01-18T15:55:20.677 回答
0

就个人而言,我不会尝试以这种方式控制访问。没有什么可以防止糟糕的程序员滥用你的类。即使在 C++ 中,他们也可以使用简单const_cast的方法来移除您的“保护”并以他们喜欢的任何方式修改单例。

相反,我会重组代码,让其他人更容易做正确的事情,而让他们很难出错。将 ControlData 的接口分离为两个独立的接口:一个用于读取对象,一个用于更新对象。然后只需在需要的地方提供两个接口。

于 2013-01-18T15:55:35.557 回答