2013-03-15 78 views
0

我的Java类有一些问题。当我调用函数(例如int getCapacity(Edge e))时,它会更改我的对象(chagne Edge e),我不想那样做。不应该只有void函数改变对象吗?任何帮助?从not 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(); 
    } 
} 

谢谢!

回答

3

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

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

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

然而,奇怪做出一个getter修改状态。这听起来对我来说是个坏主意。目前尚不清楚为什么你在这种情况下改变了开始,但你肯定可以改变你的方法,不要这样做。

即使这样的规则可以偶尔虽然是错误的。一个简单的例子就是一个LRU缓存,其中从中获取数据确实会影响状态,因为它会改变缓存溢出时保留哪些记录。虽然这比较少见。

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

+0

我只是不想改变我的对象不是void函数。我插入了一部分代码“e.setStart(-1);”只是为了测试它。 关于吸气剂,我稍后需要它。 ;)在其他类中。 – newOne 2013-03-15 14:16:26

+1

另一个例子是一个迭代器。它会改变它的状态,每次调用并返回一个值。 – 2013-03-15 14:18:09

+0

@newOne:好的,不要这样做 - 但它不是*不正确的代码。 – 2013-03-15 14:26:07