与Python不同,Java本身不支持元组。因此,不会提供tuple assignment这样有用的可能性。
您将如何实施?您的解决方案应该:
我将举一个简单的例子。不要太在意*Func()
方法的内容。它们可以内联,也可以依赖较少的变量或其他变量。
public class TupleAssignment {
static String sFunc(String s, int i, double d) {
return i + s + d;
}
static int iFunc(String s, int i, double d) {
return i + s.length() - (int) d;
}
static double dFunc(String s, int i, double d) {
return (double) i / s.length() + d;
}
public static void main(String[] args) {
String s = "ABCDE";
int i = 2;
double d = 0.6;
String s1 = sFunc(s, i, d);
int i1 = iFunc(s, i, d);
double d1 = dFunc(s, i, d);
s = s1;
i = i1;
d = d1;
System.out.println(s + ", " + i + ", " + d);
}
}
这将产生正确的结果:
2ABCDE0.6, 7, 1.0
,但需要其他变量s1
,i1
,d1
。如果您尝试通过这种方式摆脱它们:
s = sFunc(s, i, d);
i = iFunc(s, i, d);
d = dFunc(s, i, d);
您会得到错误的结果:
2ABCDE0.6, 11, 1.8222222222222224
如何获得符合以上四个要求的先前结果?如果您看到不错的局部解决方案,也可以将其添加为答案。
请注意,这个问题不是关于创建元组的问题。。您不需要实现元组返回值。您甚至不需要知道什么是元组。关于多次分配(如果您愿意,可以称为同时分配或矢量分配)。
答案 0 :(得分:2)
我不会。他们是一个可怕的主意。只需在与要返回值的方法相同的类中使自己成为第二类即可。
public Class ReturnValue{public int age; public String name;}
或者您是否偏执
public Class ReturnValue{
public final int age;
public final String name;
public ReturnValue(int pAge, String pName){age=pAGe;name=pName;}
}
但是,如果真的只是替换一个元组,那有点冗长
可能是,一旦创建了这个小类,您可能会发现它很有用并最终向其添加方法,将公共变量设为私有(或以良好的构造函数结尾),然后再将其移入自己的文件中知道这是一个成熟的工作类,您一直都缺少,并且甚至不知道如果Java提供了元组,您就不会丢失。
通常我会遇到可变的公共变量问题,但是如果该类只是用作元组,那很好,那么将立即提取值。如果不是,那么您已经认识到该类的实用程序,应该将其重构为真实的类。
在您的示例中,您肯定缺少一门课。我建议:
class Func(String s, int i, double d) {
final String s;
final int i;
final double d;
public String sFunc() {
return i + s + d;
}
public int iFunc() {
return i + s.length() - (int) d;
}
public double dFunc() {
return (double) i / s.length() + d;
}
}
public class TupleAssignment {
public static void main(String[] args) {
private func=new Func("ABCDE", 2, 0.6);
String s = sFunc();
int i = iFunc();
double d = dFunc();
System.out.println(s + ", " + i + ", " + d);
}
重点是,当您想与一组变量进行交互时,它们很可能是相关的,如果将它们放入一个类中,您可能最终将它们留在那里并使用其他功能扩展该类。
如果您有拐杖,您可能不会创建所需的新课程,并可能尝试在一个课程中完成所有工作