2016-03-08 2 views
0

Из моих Perl дней, я хотел бы иметь возможность писать код, как это, учитывая определение Color.rgb(int,int,int):Java: передача ИНТ [3], чтобы функционировать ожидая 3 ИНТ

int[] myColorData = {127, 42, 251}; 
Color myColor = Color.rgb(myColorData); 

Есть ли способ сделать что-то подобное на Java? Я пытаюсь избежать многословия, связанного с необходимостью указать [0], [1], [2] и имя переменной 3 раза, так как оно ничего не добавляет читателю.

Обратите внимание, что это простой пример; Меня интересует более общее решение, а не только как позвонить Color.rgb(). Я понимаю, что тип int[] - это не то же самое, что и тип int, но мне интересно, есть ли способ разложить массив на int или если есть другой метод вызова, который бы сделал что-то подобное?

+1

'Цвет (интермедиат RGB)': Создает непрозрачный цвет RGB с указанным значением комбинированного RGB, состоящее из красного компонента в битах 16-23, зеленый компонентом в битах 8-15, а синий компонент в битах 0-7. – nullpointer

+1

Вы можете написать собственный метод helper, который принимает значение 'int []' и возвращает (необязательный) 'Color'. Тем не менее, вам будет гораздо лучше использовать более строго типизированный подход, подобный «java-like», а не придерживаться менталитета Perl ... –

+0

@nullpointer - я не видел этого в тексте или ссылке OP , Оба они отображают 'Color (int, int, int)'. –

ответ

1

Если вы настаиваете, что вы хотите только упомянуть переменную 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); 

языков сценариев, в отличие от статически типизированным скомпилированных языков, как правило, делают это легко вызвать функции динамически с помощью массивов.

+1

, запрещающий неожиданный ответ, я Думаю, ты ответил на мой вопрос. учитывая строго типизированную природу языков, таких как java, нет аналогичного способа лениво передавать аргументы. – simpleuser

1

Единственный путь:

int[] myColorData = {127, 42, 251}; 
Color myColor = Color.rgb(myColorData[0], myColorData[1], myColorData[2]); 
+1

Ну, вы могли бы сделать это с отражением ...но да, вы описали единственный * здравомыслящий * способ ;-) – dnault

+0

К сожалению, у меня нет aslmot опыта с отражением .. sooo let's keep * sane *, как вы сказали в этом случае>, < –

0

, но мне интересно, есть ли способ разложить массив на int или если есть другой метод вызова, который бы сделал что-то подобное?

Там нет прямого пути в Java, но вы всегда можете создать свой собственный метод:

int[] myColorData = {127, 42, 251}; 
Color c = convertRGB(myColorData); 

public static Color convertRGB (int[] color){ 
    return new Color(color[0], color[1], color[2]); 
} 

Вы также можете записать его в свой собственный класс Utilities, так что у вас есть тайник самостоятельно определить методы использовать:

final class MyColorUtil 
{ 
    public static Color convertRGB (int[] color){ 
     return new Color(color[0], color[1], color[2]); 
    } 
} 
Смежные вопросы