这两个PhysicsVector方法有什么区别?

时间:2015-11-30 15:33:37

标签: java

根据评论,他们应该做同样的事情。除此之外,当我使用'添加'而不是' increaseBy',我的代码产生不同的输出。

private static string[] ParseArguments(string text)
{
    if (string.IsNullOrWhiteSpace(text)) return new string[0];
    var entries = new List<string>(8);
    var stringBuilder = new StringBuilder(64);
    var inString  = false;
    var l = text.Length;
    for (var i = 0; i < l; i++)
    {
        var c = text[i];
        if (inString)
        {
            if (c == '"')
            {
                if (i != l - 1 && text[i + 1] == '"')
                {
                    stringBuilder.Append(c);
                    i++;
                }
                else inString = false;
            }
            else stringBuilder.Append(c);
        }
        else if (c == '"') inString = true;
        else if (char.IsWhiteSpace(c))
        {
            if (stringBuilder.Length == 0) continue;
            entries.Add(stringBuilder.ToString());
            stringBuilder.Length = 0;
        }
        else stringBuilder.Append(c);
    }
    if (stringBuilder.Length != 0) entries.Add(stringBuilder.ToString());
    return entries.ToArray();
}

这就是一个,而另一个是:

/**
* standard vector addition. If <b> v = xi + yj</b>
* and <b>u = wi + zy</b>, then the method returns a vector
* <b>(x+w)i + (y+z)j</b>
*
* @param v first vector in sum
* @param u second vector in sum
* @return return summed vector
**/
public static PhysicsVector add(PhysicsVector v, PhysicsVector u){
    PhysicsVector sum = new PhysicsVector(v);
    sum.increaseBy(u);
    return sum;
}

2 个答案:

答案 0 :(得分:8)

前者创建向量v副本,增加它,然后返回该副本。后者实际上修改传递给它的原始矢量。

所以:

PhysicsVector u = new PhysicsVector(1, 1);
PhysicsVector v = new PhysicsVector(2, 4);

PhysicsVector result = PhysicsVector.add(u, v);

// u and v are still (1, 1) and (2, 4), and result is (3, 5)

但是increaseBy

PhysicsVector u = new PhysicsVector(1, 1);
PhysicsVector v = new PhysicsVector(2, 4);

u.increaseBy(v);

// u itself has now been changed to (3, 5)

答案 1 :(得分:5)

虽然这两种方法执行相同的任务,但它们返回结果的方式不同:

  • 第一种方法会生成一个 new PhysicsVector来表示总和,而且只涉及vu没有任何副作用。
  • 第二种方法执行添加到位,因此调用该方法的副作用。

这就是为什么从一种方法切换到另一种方法时会得到不同结果的原因。

  

result.add(u,v)似乎不起作用

请注意,API的结构提供了正在发生的事情的提示,因为第一种方法是static。在实例上调用静态方法表示使用问题。你需要做的是

result = PhysicsVector.add(u, v);