1

我有两个不同的类,它们与私有字段具有相同的类。这个私有字段需要从一个类传递到另一个类(或在另一个类中访问),但我不确定如何。

这是我正在尝试做的一个例子:

public class RealVector() {

    private double[] components;

     // Other fields and methods in here

    public double distance(RealVector vec) {
        // Some code in here
    }
}

public class Observation() {

    private RealVector attributes;

    // Other fields and methods in here
}

public class Neuron() {

    private RealVector weight;

    // Other fields and methods in here   

    public double distance(Observation obs) {
        return weight.distance(obs.attributes); // This is what I want to do, but it won't work, since attributes is private
    }   
}

RealVector 的 distance 方法需要一个 RealVector 传递给它,但是 Neuron 的 distance 方法只有一个 Observation 传递给它,它包含一个作为私有字段的向量。我可以想到几个解决方法,但我不太喜欢它们。

1) 使 Observation 和 Neuron 扩展 RealVector 类。然后我什至不必编写距离函数,因为它只使用超类(RealVector)距离方法。我不太喜欢这个解决方案,因为 Observation 和 Neuron 与 RealVector 类有“有”关系,而不是“是”关系。

2) 在 Observation 类中有一个返回 RealVector 的方法。

public RealVector getAttributes() {
    return attributes;
}  

我不喜欢这种解决方案,因为它违背了将 RealVector 字段设为私有的目的。在这种情况下,我不妨公开属性。

我可以让它返回类中 RealVector 的(深层)副本。这种方法似乎效率低下,因为每次调用 getAttributes() 时都必须复制 RealVector(本质上是复制数组)。

3)使用接口。对接口做的不多,所以我不太确定它们在这里是否合适。

有谁知道我可以将属性保留为观察的私有成员并完成我希望在神经元的距离方法中做的事情?

4

3 回答 3

1

如果您的Observer班级有一个距离方法,RealVector那么您不需要公开 private RealVector attributes

public class Observation {

    private RealVector attributes;

    public double distance(RealVector weight){
        return weight.distance(attributes);
    }
}

public class Neuron {

    private RealVector weight;

    public double distance(Observation obs) {
        return obs.distance(weight);
    }   
}
于 2012-08-23T02:41:07.283 回答
0

这样做的标准方法是保留字段private并创建public getXXX()setXXX()方法。

关于

我不喜欢这种解决方案,因为它违背了将 RealVector 字段设为私有的目的。在这种情况下,我不妨公开属性。

您应该了解,仅公开公共 getter 不会损害该字段的私有属性,并且一个属性只有在不需要访问任何其他类时才是真正私有的。

于 2012-08-23T02:41:34.093 回答
0

一种可能的方法是getter/setter为您的类的私有变量引入方法。因此,例如,对于您的Observation课程,您可以将其修改如下:

public class Observation() {

    private RealVector attributes;

    public RealVector getAttributes(){
        return attributes;
    }

    public RealVector setAttributes(RealVector attributes){
        this.attributes = attributes;
    }

    // Other fields and methods in here
}

编辑您的问题有以下关于getter/setters我错过的评论:

我不喜欢这种解决方案,因为它违背了将 RealVector 字段设为私有的目的。在这种情况下,我不妨公开属性。

如果您真的不想公开RealVector矢量场,我认为您可以做的就是为您的班级getter/setter中的个人提供方法。通过这种方式,您可以控制要从类中公开的内容。attributesRealVectorObservation

于 2012-08-23T02:42:12.870 回答