Calling a Java method with variable number of arguments in JRuby

결론부터 얘기하자면, Java의 variable number of arguments(이하 varargs)를 가진 Java 메서드를 JRuby 코드에서 호출하려면, 여러 argument들을 나열하거나 Ruby Array를 사용하면 안되고, Java array 객체를 생성해주어야한다. Java의 varargs는 Java array와 동일하게 취급되므로 당연히 Java array의 경우에도 마찬가지다. 그렇다면, Ruby Array는 무엇이랑 대응될까? 바로 java.util.List다.

다음은 이러한 동작을 테스트하기 위한 간단한 Java 클래스. 위에서 언급한대로, Java array parameter를 varargs로 보면 되겠다.

import java.lang.String;
import java.util.List;
import java.util.ArrayList;
import java.util.Arrays;

public class Song {

    public enum Category {
       
POP, ROCK, CLASSIC, JAZZ
   
}

    private String title;
   
private List<Category> categories = new ArrayList<Category>();

    public Song(String title) {
       
this.title = title;
   
}

    public void setCategory(Category category) {
       
this.categories.clear();
       
this.categories.add(category);
   
}

    public void setCategoryList(List<Category> categories) {
       
this.categories.clear();
       
this.categories.addAll(categories);
   
}

    public void setCategories(Category[] categories) {
       
this.categories.clear();
       
this.categories.addAll(Arrays.asList(categories));
   
}
   
   
public String toString() {
       
return "Title: " + title + " Categories: " + categories;
   
}
       
}  

다음은 위의 Java 클래스를 사용하는 JRuby 코드.

require 'java'

include_class 'Song'

song = Song.new 'Waiting On The World To Change'
puts song

song.setCategory Song::Category::POP
puts song

categories = Array.new
categories.push Song::Category::POP
categories.push Song::Category::ROCK
puts categories.length
puts categories.size
song.setCategoryList categories
puts song

categories = Song::Category[].new 2
#categories.add Song::Category::POP # not working
categories[0] = Song::Category::POP
categories[1] = Song::Category::CLASSIC
puts categories.length
#puts categories.size # not working
song.setCategories categories
puts song

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

이 사이트는 스팸을 줄이는 아키스밋을 사용합니다. 댓글이 어떻게 처리되는지 알아보십시오.