1

プライベートフィールドと同じクラスを持つ2つの異なるクラスがあります。このプライベートフィールドは、あるクラスから別のクラスに渡す(または他のクラスでアクセスする)必要がありますが、方法がわかりません。

これが私がやろうとしていることの例です:

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の距離メソッドが機能するには、RealVectorが渡される必要がありますが、Neuronの距離メソッドには、プライベートフィールドとしてベクトルを含むObservationのみが渡されます。いくつかの回避策を考えることができますが、私はそれらが本当に好きではありません。

1)ObservationとNeuronにRealVectorクラスを拡張させます。そうすれば、スーパークラス(RealVector)の距離メソッドを使用するだけなので、距離関数を作成する必要もありません。オブザベーションとニューロンはRealVectorクラスと「hasa」関係にあり、「is a」関係ではないため、このソリューションはあまり好きではありません。

2)RealVectorを返すObservationクラスのメソッドがあります。

public RealVector getAttributes() {
    return attributes;
}  

このソリューションは、RealVectorフィールドをプライベートにするという目的に反するため、好きではありません。この場合、属性を公開したほうがよいでしょう。

クラス内のRealVectorの(深い)コピーを返すようにすることができます。getAttributes()を呼び出すたびに、RealVectorのコピーを作成する(基本的には配列をコピーする)必要があるため、このアプローチは非効率的です。

3)インターフェースを使用します。インターフェイスについてはあまり行っていないので、ここで適切かどうかはわかりません。

私がObservationのプライベートメンバーとして属性を保持し、Neuronの距離法で私が探していることを達成する方法を知っている人はいますか?

4

3 に答える 3

1

Observerクラスにを取り込むdistanceメソッドがある場合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フィールドをプライベートにするという目的に反するため、好きではありません。この場合、属性を公開したほうがよいでしょう。

public getterだけを公開しても、フィールドのprivate属性が損なわれることはなく、他のクラスにアクセスする必要がない場合にのみ、1つの属性が本当にプライベートになることを理解する必要があります。

于 2012-08-23T02:41:34.093 に答える
0

getter/setter考えられる1つの方法は、クラスのプライベート変数のメソッドを導入することです。したがって、たとえば、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/setterattributesRealVectorObservation

于 2012-08-23T02:42:12.870 に答える