0

Java クラスに問題があります。関数 (たとえば int getCapacity(Edge e)) を呼び出すと、オブジェクト (chagne Edge e) が変更されますが、そうしたくありません。オブジェクトを変更するのは void 関数だけではありませんか? 何か助けはありますか?

public class Edge{

    private int start;

    private int end;

    private int capacity;  

    private int flow;  

    public Edge(int p, int k, int cap) {
        this.start = p;
        this.end = k;
        this.capacity = cap;
        this.flow=0;
    }

    public void setStart(int s){
            this.start = s;
    }


    public static int getCapacity(Edge e){
            e.setStart(-1);
            return e.capacity;
    }


    public static void main(String[] args){
        Edge e= new Edge();
        int k=getCapacity(e));
        e.print();
    }
}

ありがとう!

4

1 に答える 1

3

オブジェクトを変更するのは void 関数だけではありませんか?

必ずしも。これの非常に単純な例はStringBuilderで、ほとんどすべてのメソッドが を返すthisので、次のように書くことができます:

builder.append(x).append(y);

しかし、ゲッターを変更状態にするのは驚くべきことです。それは私には悪い考えのように聞こえます。この特定のケースで開始を変更する理由は明らかではありませんが、それを行わないように方法を変更することはできます。

ただし、そのルールでさえ間違っている場合があります。これの簡単な例は LRU キャッシュです。キャッシュからデータを取得すると、キャッシュがオーバーフローしたときに保持されるレコードが変更されるため、状態に影響します。それは比較的まれですが。

getCapacityまた、静的メソッドである理由も不明です。宣言するクラスと同じ型のパラメーターを持つ静的メソッドに注意してください。null 参照 (これはそうではありません) に対処するために意図的にそのようにしない限り、通常はそれらをインスタンス メソッドに変更する必要があります。

于 2013-03-15T14:12:31.433 に答える