我有方法将String记录列表解析为对象并返回List个对象。 所以我的方法签名是这样的。
public Listparse(String[] records);
但我也想返回,其他指标,如未成功解析的字符串记录数。 现在我感到困惑,如何返回此指标。 一种选择是创建另一个包装类,该类包含已解析记录列表和存储这些度量标准的成员。
但是我经常面对这种情况,这样我最终会创建许多包装类。
不确定我是否解释得很好。 这里有什么建议?
您可以在声明此parse()方法的类中包含其他变量(如果它适合OOP概念)并编写getter方法来访问这些值。
你期望每个记录解析1个对象吗? 如果是这样,调用代码可以将列表的大小与记录的长度进行比较。
这只是一个例子,尽管它可以在这种情况下起作用。
您的问题已经讨论过(请参阅此示例:Java方法参数是否应该用于返回多个值?)。我个人认为如果返回的数据不相关,你应该进行两次方法调用。如果是,那么你应该在调用它时创建一个"包装器"类。如果它们确实是相关数据,那么无论如何它们可能属于同一类。
我个人不赞成修改传入的对象,因为对我来说这是一个副作用,并且不清楚这个方法到底做了什么。
另一种思考方式是使用工厂模式(请参阅http://en.wikipedia.org/wiki/Factory_method_pattern),如果您正在构建的对象很复杂。
遗憾的是,Java不支持从函数返回多个值。你可以创建一个包装类,就像你说的那样。另一个选择是传入一个整数数组或一个"指标"对象或类似的东西,并在Parse中修改它。稍微好一点的可能是拥有一个或多个实例变量(而不是方法变量)来跟踪您需要的任何类型的诊断信息。
一个快速的包装器类并不是一个很大的投资,特别是如果你只需要在一个文件中,并且只需要一个几行长的内部类。
我认为,如果它只在一个类中,使用实例变量来跟踪信息是一种更简洁的方法,但当然这也是一种合理的方法。作者特别提到不想创建很多包装类,所以我认为解释替代方案会很好。
使用实例变量将使线程安全的方式更难以使用该类,我会避免使用它。
是的,这是一种可能性,但设计接受参数中的某个对象并更新它的方法是一种很好的做法。例如,在这种情况下的度量对象?
我更喜欢避免这样的副作用。根据此解析方法所负责的类,我将使用实例变量或包装类。 @ARRG是正确的,如果它需要是线程安全的,你应该避免实例变量。
Hrrrrrm。我认为,不变性是一种更相关的实践,并且调用者必须处理一个恰当的返回值的对象是很尴尬的。
您可以返回包含列表的复杂对象以及所需的所有信息。
创建一个ParseResult对象。您可以包括List,已解析的记录数,错误等。使其足够通用,以便可以从不同的方法返回它。您甚至可以将其作为基类并返回从中扩展的类。只是按照对象进行思考。
对于使用Java开发的许多人来说,这是一个非常普遍的问题。在其他语言中,例如Scala,可以创建元组,这些元组是可以包含多个值的匿名对象,并将它们用作参数或返回值。
包装类是从函数返回更多信息的标准方法。另一种方法是通过引用传递另一个参数并在函数中修改它,从而有效地将新信息返回给调用者。例如,在您的情况下,您将传递一个空列表并添加该列表中的所有已解析元素。返回类型可以是度量标准或错误代码。因此呼叫者将具有两条信息。
我打算向你推荐一种'c ++ pair'类型,但后来我发现了这个:Java中C ++ Pair 的等价物是什么?
也许这可以帮助http://www.yoda.arachsys.com/java/parameters.html