2009-06-26 3 views
0

안녕하세요!배열의 문자열을 기반으로 메서드에 액세스하려면 어떻게해야합니까?

이것이 가능한지 확실하지 않지만 잘하면 자바로되어 있습니다. 가변 변수를 사용하고 변수를 동적으로 액세스하여 PHP에서이 작업을 수행 한 것을 알고 있지만 다른 질문에서는 Java에서는이 작업을 수행 할 수 없습니다.

JSF GUI에 체크 상자 상태를 포함하는 문자열 배열이 있습니다. 모든 체크 박스가 설정되면 배열은 다른 체크 박스의 값을 포함하는 문자열로 채워질 것입니다.

private static final String[][] OVERVIEW_FIELDS = {{"ID", "requestid"}, 
    {"Date added", "dob"}, {"Title", "requestTitle"}, {"Process", "processId"}, 
..., ..., ...}; 

은 그 때 나는 그것을 밖으로 JSF SelectItems를 배열을 반복하고합니다 :

for (int i = 0; i < OVERVIEW_FIELDS.length; i++) { 
    SelectItem item = new SelectItem(OVERVIEW_FIELDS[i][0], OVERVIEW_FIELDS[i][1]); 
    getFields().add(item); 
} 
확인란의

레이블과 값은 다음과 같습니다 배열을 통해 반복에 의해 구축

문제 및 현재 해결책 (누군가가 나를 리팩터링하여 더 나은 것으로 변신하도록 도울 수 있습니다 :

for (String item : getVisibleFields()) { 
      if (item.equals("dob")) { 
       setDob(true); 
      } 
      if (item.equals("requestTitle")) { 
       setRequestTitle(true); 
      } 
      if (item.equals("processId")) { 
       setProcessId(true); 
      } 
      if (...) { 
      } 
} 

이렇게 계속해서 11 개의 부울이 계속됩니다. 이 솔루션이 마음에 들지 않아 내 시스템의 다른 콩에서 비슷한 패턴을 본다.

누구에게 더 좋은 해결책이 있는지 알고 있습니까? 부울은 확인란 필드 배열에 포함 된 내용에 따라 렌더링 된 필드를 true/false로 설정하는 열을 제어합니다.

JSF EL에서 visibleFields 변수와 contains 메소드에 액세스 할 수 있기를 기대 했으므로 객체가 배열에 존재하면 true 또는 false를 반환합니다. 이것은 작동하지 않는 것 같아 EL이 나를 포함하는 메소드에 접근 할 수 없다.

rendered="#{overviewFilterBean.dob}" 

을 그리고 나는이 코드를 시도 :

내가 현재 사용하고

rendered="#{overviewFilterBean.visibleFields.contains['dob']}"> 

지금이 내 마지막 배열을 사용하고 getFields().contains(OVERVIEW_FIELDS[i][1])에 따라 논리 값을 설정하려고 저를 주도, 어떻게하면 가능합니까?

일부 실제와 일부 의사 코드 (지금을 목표로 한 솔루션을) 다음과

for (int i = 0; i < OVERVIEW_FIELDS.length; i++) { 
    if (item.equals(OVERVIEW_FIELDS[i][1])) { 
      setOVERVIEW_FIELDS[i][1](true); 
     } 
    } 

큰 질문 :

OVERVIEW_FIELDS[i][1]에서 값을 사용 할 수있는 방법이 있나요 올바른 부울 변수를 설정하거나지도로 바꾸고 JSF EL을 사용하여 키가지도에 있는지 확인 할 수 있습니까?

는 시간 내 주셔서 감사하고, 같은 긴 질문을 작성하기위한 미안 작은 지점에 도착 :/

편집 : 코드의 반영 방법 (5 개) 예외의 결과

, 큰 블록을 그들을 취급하고 또한 사람들은 그것의 비싼 방법이라고 말했다.이것은 내가 오래된 해결책이나지도를 사용하는 것이 최선의 방법이라고 믿게한다. 지도 솔루션을 사용해 보자. =)

답변

0

자바 리플렉션 API를 사용하여 필드를 동적으로 검색하고 this example처럼 설정할 수 있습니다. 이 메소드에는 성능이 저하됩니다.

3

reflection으로, 당신은 할 수 있습니다 :

for (String item : getVisibleFields()) { 
    getClass().getMethod("get" + capitalize(item)).invoke(this, true); 
} 

예외 처리와 capitalize 방법은 (invoke많은 예외를 throw) 독자에게 연습으로 남아 있습니다.

+0

안녕하십니까.이 방법을 수행 할 수있는 코드를 보여 주셔서 감사합니다. 당신이 말한 것처럼 매우 사실입니다. 이것은 예외의 톤을 생성하고, 일을하는 데 비용이 많이 들지 만, 각 부울을 시도하는 것만으로도 IM이 더 좋을까요? –

+0

예, 부울 필드 만 포함하는 목록이있는 것이 좋습니다 (이 질문을 작성할 때 질문에 대한 오해가 있음). 그러나 그러한 목록을 가지고 있다면,지도를 작성할 수도 있습니다. –

+0

예 JSF EL에서 렌더링 된 "# {! empty testBean.map [ 'test']}"와 bool을 설정하는 대신 맵을 채울 수 있다는 것을 알았 기 때문에 그의 대답을 받아 들였습니다! 감사 –

관련 문제