我来自.net背景,想知道创建一个方法的可接受方式,该方法返回一个布尔值并修改一个通过参数传入的字符串.我理解字符串在Java中是不可变的,因此下面的代码片段将始终产生一个空字符串.我被限制只返回布尔值.不能抛出例外情况.如果我需要将String类包装在一个StringHolder中,我可以在哪个包中找到它.
public static void DoStuff() { String msg = ""; if (GetMessage(msg)) { System.out.println(msg); } }
Michael Borg.. 9
使用java.lang.StringBuilder - 基本上是一个可变的String.但是,返回修改后的String会更安全,更"Java风格".
使用java.lang.StringBuilder - 基本上是一个可变的String.但是,返回修改后的String会更安全,更"Java风格".
我强烈建议你不要使用StringBuilder,持有者或类似的东西.他们是黑客.您希望使用字符串,而不是构建器.
最明显的方法是返回包含要返回的数据的对象.大卫的[bombe.livejournal.com]解决方案涵盖了这一点,所以我不再重复了.但是,我建议不要试图使它成为通用的数据球,使其具体化.使它像一个对象,也许它甚至可以成长为真实的行为.(如果你真的想去城里,隐藏构造函数并改为给它一个静态的创建方法.)
第二种方法,在Java中得不到很好的支持,就是反转调用.而不是返回结果,告诉回调结果.
(更重要的)使用代码会是这样的(它看起来有点奇怪,因为它不是特定的,也不是通用的):
String userMessage = thing.doStuff(new StuffHandler() { public String stuff(boolean success, String message) { return message+" was "+(success ? "succesful" : "unsuccesful"); } });
实现类似于:
public interface StuffHandler{ T stuff(boolean success, String message); } [...] public T doStuff(StuffHandler handler) { handler.stuff(isSuccess(), getMessage()); }
第三种方法就是将方法分解为两种.这可能是也可能是不可行的.
首先,我可能不会有这些要求.我相信他们可以解决.如果您不想这样做,我建议您为两个结果返回一个容器对象:
public class ResultContainer { private final boolean success; private final String result; public ResultContainer(boolean success, String result) { this.success = success; this.result = result; } public boolean isSuccess() { return success; } public String getResult() { return result; } }
在您的主要代码中:
ResultContainer resultContainer = GetMessage(message); if (resultContainer.isSuccess()) { System.out.println(resultContainer.getResult()); }
GetMessage()
显然会创建一个新的a实例ResultContainer
并返回它,并填充返回值.
(使用Generics ResultContainer
作为读者的练习.)