字符串concat在java中不起作用

字符串concat在java中不起作用,java,string,concat,Java,String,Concat,我有以下代码: private String foo; public void setFoo(String bar) { foo = bar + "bin/"; } 我希望这段代码能够使用重载的'+'操作符连接条和“bin/”。当我在调试器中执行相同的代码示例时,效果很好。由于某种原因,虽然foo总是等于bar,而且里面从来没有“bin/” 实际代码: private String execpath_; public void setMambaPath(String execut

我有以下代码:

private String foo;

public void setFoo(String bar)
{
  foo = bar + "bin/";
}
我希望这段代码能够使用重载的
'+'
操作符连接条和
“bin/”
。当我在调试器中执行相同的代码示例时,效果很好。由于某种原因,虽然foo总是等于bar,而且里面从来没有
“bin/”

实际代码:

 private String execpath_;

  public void setMambaPath(String executable)
  {

    if (!(executable.endsWith("/")))
      executable = executable.concat("/");

    execpath_ = executable + "bin/";
  }
execpath_u=在没有bin/的情况下可执行的其他位置:

StringBuilder cmd = getSshCommand_();
cmd.append(execpath_ + "mambaService");

我不会在其他任何地方使用execpath uu

发布更多代码(包括以后使用
foo的地方)。
foo
正在其他地方修改,或者
setFoo
有一个本地
foo
正在修改,而不是
this.foo
。我很确定这是第一个。

String
是不可变的变量,不包含更改
String
对象本身内容的方法。所以您需要使用
concat()
方法

或者第二种方法,您可以使用
StringBuilder

private String foo;

public void setFoo(String bar)
{
  StringBuilder builder = new StringBuilder();
  builder.append(bar + "bin/");
  foo = builder.toString();
}
工作内容:

  public void setMambaPath(String executable)
  {

    if (!(executable.endsWith("/")))
      executable = executable.concat("/");

    executable = executable.concat("bin/");

    execpath_ = executable;
  }

这是所有的代码,我可以在foo调用后在调试器中查看它,它没有改变。调用
setFoo
将foo设置为带有bin/concatenated的bar。代码或环境的其余部分有问题。因为你还没有发布,没有人能告诉你那是什么。我已经用我正在使用的实际代码进行了更新。仍然没有足够的代码。当你告诉我们哪里有一条带有你不想要的值的
Log
trace消息时,我们就成功了。@Gene你帮不上忙,但我帮不上忙。请看我在开始工作的代码下的评论。还有其他一些问题。他不能在适当的位置更改字符串,但他肯定可以替换变量引用的字符串(这就是他正在做的)。而且+似乎是一个很好的运算符……”Java语言为字符串连接运算符(+)提供了特殊支持;也不会改变它。我很困惑,我只是在调试器中逐级处理它,这没有任何意义,而且…他们基本上是在感谢你帮助我回答问题,而不是盲目地要求更多不相关的东西。所以至少有两个不必要的临时字符串。StringBuilder方法的效率显著提高。如果execpath_uu字段设置为不可变,我也不会感到惊讶。不可变对象是好的。当原始对象不可用时,这仍然没有任何意义。它只能是1)其他更改(因为有一个构建问题自行解决)、2)编译器错误或其他3)一个线程是编写器,另一个是读取器,因此必须声明该成员为volatile,以确保不会生成线程本地副本。如果是线程局部问题,那么它可能仅仅因为调用concat()阻止了优化器而消失。这不是一个稳健的解决方案。这就是为什么我一直要求更多的代码。解决这个问题还不够。@Gene-我不得不同意。我认为“修复”是一个副作用修复。根本原因很可能仍然存在,只是不太可能发生(但仍然可能发生)。这些症状符合正在发生的线程问题。