你如何在Java中重现const-pointers的行为?

时间:2013-01-18 15:43:18

标签: java c++ const-pointer

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

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

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

3 个答案:

答案 0 :(得分: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来颠覆这一点,但至少它需要一些有意识的努力(添加演员),这应该提醒程序员(s)他正在做一些他不应该做的事情。

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

答案 1 :(得分:0)

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

ControlflowVariables StateVariables

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

singletonClass.variable并不比singletonClass.getVariable()

如果您只想在代码中的某些点限制访问权限,请创建变量

的最终副本
final int variable = singletonClass.getInstance().variable;

答案 2 :(得分:0)

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

相反,我会重新构建代码,以便让其他人轻松做正确的事情,并且很难让他们弄错。将ControlData的接口分成两个独立的接口:一个用于读取对象,另一个用于更新对象。然后只需提供他们需要的两个接口。