【问题标题】:Modifying object from not void function从非 void 函数修改对象
【发布时间】:2013-03-15 14:10:12
【问题描述】:

我的 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();
    }
}

谢谢!

【问题讨论】:

    标签: java class function void


    【解决方案1】:

    不应该只用 void 函数改变对象吗?

    不一定。一个非常简单的例子是StringBuilder,几乎所有的方法都返回this,所以你可以这样写:

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

    然而,让 getter 修改状态 令人惊讶。这对我来说听起来是个坏主意。目前尚不清楚为什么您在这种特殊情况下改变起点,但您当然可以改变您的方法以不这样做。

    即使是该规则也可能偶尔是错误的。一个简单的例子是 LRU 缓存,从中获取数据确实会影响状态,因为它会在缓存溢出时更改保留哪些记录。不过这种情况比较少见。

    也不清楚为什么getCapacity 是一个静态方法。注意带有与声明类相同类型参数的静态方法。除非故意这样处理空引用(这不是),否则您通常应该将它们更改为实例方法。

    【讨论】:

    • 我只是不想将我的对象从非 void 函数中更改。我插入了一部分代码“ e.setStart(-1);”只是为了测试它。关于吸气剂,我以后需要它。 ;) 在其他课程中。
    • 另一个例子是迭代器。它会在每次调用时改变它的状态并返回一个值。
    • @newOne:好的,不要这样做 - 但这样做并不是不正确代码。
    • Function public static int getCapacity(Edge e) 不应该改变参数 Edge e 无论我在它的主体(函数主体)内做什么。我可以做任何我想做的事情,函数应该返回一个 valeu (int) 而不是改变 Edge,这就是问题所在!我开始失去神经了:)
    • @newOne:所以修复代码,让它不会那样做。你负责代码,对吧?由你来确保它不会做任何愚蠢的事情。
    猜你喜欢
    • 2012-12-01
    • 1970-01-01
    • 2019-10-17
    • 2016-04-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-27
    • 2013-06-14
    • 2020-09-17
    相关资源
    最近更新 更多