从我使用 Perl 的日子开始,我希望能够编写这样的代码,给出定义 Color.rgb(int,int,int) :
int[] myColorData = {127, 42, 251};
Color myColor = Color.rgb(myColorData);
有没有办法在Java中做类似的事情?我试图避免必须指定 [0]
、[1]
、[2]
和变量名称 3 次的冗长因为它对读者没有任何帮助。
请注意,这只是一个简单的示例;我对更通用的解决方案感兴趣,而不仅仅是如何调用 Color.rgb()
。我知道类型 int[]
与类型 int
不同,但我想知道是否有办法将数组分解为 int
>,或者是否有其他调用方法可以执行类似的操作?
最佳答案
如果您坚持只想提及变量 myColorData
一次(而不是 3 次),那么您可以通过反射来实现 - 但它非常丑陋:
import javafx.scene.paint.Color;
try {
// Setup code
Method m = Color.class.getMethod("rgb", int.class, int.class, int.class);
// Your code
Object[] myColorData = {127, 42, 251};
Color myColor = (Color)m.invoke(null, myColorData); // Invoke static method with an array of arguments
// Confirmation
System.out.println(myColor);
// OMG this hurts
} catch (IllegalAccessException|IllegalArgumentException|InvocationTargetException|NoSuchMethodException|SecurityException e) {}
鉴于此,如果您发现自己经常使用此模式,那么最好编写一个不使用反射的辅助方法:
static Color rgbColor(int[] rgb) {
return Color.rgb(rgb[0], rgb[1], rgb[2]);
}
<小时/>
顺便说一句,您想要在 Python 和 JavaScript 中做的事情很容易(假设存在等效的库):
# Python
myColorData = [127, 42, 251]
myColor = Color.rgb(*myColorData)
// JavaScript
var myColorData = [127, 42, 251];
var myColor = Color.rgb.apply(null, myColorData);
与静态类型编译语言不同,脚本语言通常可以轻松地使用数组动态调用函数。
关于Java:将 int[3] 传递给需要 3 个 int 的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35875885/