2014-10-04 3 views
-2

배열에 정수, 문자열 등을 저장할 수 있다는 것을 알고 있습니다. 그러나 메서드 나 클래스 등의 "더 큰"것들을 배열에 저장하고 정수, 문자열 대응 물처럼 쉽게 액세스 할 수 있다면 궁금합니다.배열에 메서드, 클래스 등을 포함 할 수 있습니까?

나는 그와 같은 것이 유용 할 때 여러 번 상상할 수 있습니다. 그러한 메소드 배열이 사용되는 예제 코드가 있습니까?

주어진 정수 나 문자열에서 메서드를 사용하려는 경우 특히주의해야합니다. 어쩌면 다음과 같습니다. a[i](m, n, "qwerty"), dunno. a [i]는 방법입니다. m, n은 정수이고, "qwerty"는 문자열입니다. 이 표기법을 사용하면 for 루프를 작성하고 모든 메소드를 다시 작성하지 않고도 여러 메소드를 사용하는 것이 매우 쉽습니다. 배열에서 그렇게 할 수없는 것처럼 보이므로 다른 옵션이 있습니까? "메소드 참조"의 사용을 확인합니다.

+0

이 질문은 상당히 모호합니다 - 당신은 당신이 달성하려고하는지에 정교한 수 있습니다 (의사 코드에서도)? – Mureinik

+0

@Imago 이해가 안됩니다. 데이터 구조는 어떻게 클래스를 포함 할 수 있습니까? 당신은 객체 (클래스의 인스턴스)를 의미합니까? 그 경우 배열 이미 개체를 포함 할 수 있습니다 .. 문자열은 클래스입니다. 유틸리티 메소드를 사용하려는 경우 Arrays 클래스에는 매우 멋진 클래스가 있습니다. – Alboz

+0

http://docs.oracle.com/javase/tutorial/java/nutsandbolts/arrays.html – Dici

답변

1

Java에서 메소드는 일등급 시민이 아니며 데이터로 처리 될 수 없습니다. 즉 수 없습니다 배열에 메서드를 저장할 수 없습니다. 한편

, 당신 수 배열 저장소 개체 : 이것은 10 MyClass 객체의 배열을 생성

MyClass[] myArray = new MyClass[10]; 

.

+0

Java 리플렉션은 Method 객체를 제공하므로 기술적으로 배열에 "메소드"를 저장할 수 있습니다. 포스터가 "쉽게 접근 할 수있다"는 요청을 이행하지는 못할지라도 – cello

+2

@cello 이것은 배열 자체에 메서드 자체를 저장하는 것과 거의 같습니다. OP가 Lisp이나 Haskell 같은 언어에 노출되어 있다고 생각합니다. 여기서 ** 함수를 목록에 저장할 수 있습니다. –

+0

@ Code-Apprentice 함수에 대한 포인터의'C' 배열을 생각하고있었습니다 ...하지만 그 경우에도 가리키는 함수는 같은 정의를 가져야합니다. – AntonH

1

모든 클래스의 객체를 포함하는 배열을 정의 할 수 있습니다.

myObjects[0] = new MyClass(); 

을 그리고 그 위에 MyClass에의 방법 중 하나를 호출 :

MyClass myObjects = new MyClass[2]; 

그런 다음 배열의 위치에 클래스의 인스턴스를 할당 할 수

myObjects[0].doSomething(someParameter); 
1

예. Java에서 정의한 클래스에는 메소드 또는 다른 클래스의 변수가 포함되며 클래스의 배열을 정의 할 수 있습니다. 예 : 그래서 당신은이 클래스에서 배열 변수를 정의하면

class Myclass { 
    Myclass(){...} 
    String data; 
    void process(){ 
     var1.doSomething(); 
    } 
    OtherClass var1, var2; 
} 

, 여기에 예입니다

Myclass[] myClasses = new Myclass[5]; 
myClasses[0]=new Myclass(); 
... 
myClasses[1].process(); 

내 대답은 모호한 보일 수 있지만, 실제 예제와 함께 질문을 업데이트 할 경우, 그때는 것 더 의미.

+0

'myClasses [1] .process()'는 NPE를 발생시킵니다. –

+0

@ Code-Apprentice 알아 차 렸어 ...? 그 배열에있는 모든 객체를 초기화하는 데 필요한 코드입니다 –

+0

... 이제는 더 이상 확실하지 않습니다. –

0

개체 배열을 만들고 해당 개체의 메서드에 액세스하려는 것처럼 들립니다. 배열 + 위치는 그 위치에있는 배열 안에 저장된 객체의 참조이므로 메서드를 호출하기 만하면됩니다.

예.

public class Demo { 

     public static void main(String[] args) 
     { 
      Demo[] array = new Demo[5]; // array of 5 Demo objects of class Demo. 

      for (int a = 0; a < array.length; a++) // looping through the array to instantiate each object. 
      { 
       array[a] = new Demo(); //instantiating the object at position 'a'. 
      } 

      for (int a = 0; a < array.length; a++) // looping through the array to access each object. 
      { 
       array[a].sysOut(a); //accessing the sysOut method of the Demo object at position 'a' and passing int 'a' as a parameter. 
      } 
     } 

     public void sysOut(int a) // method of class Demo accepting an int parameter. 
     { 
      System.out.println(a + " is a Demo object."); 
     } 
    } 

따라서 클래스는 배열 내부에 보관할 수 없지만 해당 클래스로 만든 객체가 될 수 있습니다. 배열 안의 객체를 지정된 위치에 배치하면 배열 이름과 위치가 객체의 참조가됩니다.

0

클래스를 참조하는 방법에 대한 답변이 몇 가지 있습니다. 이는 메서드를 참조하는 방법을 보여줍니다.이것은 구문의 예일 뿐이므로 원하는 메서드 만 검사하고 더 나은 메서드를 수집하는 더 나은 방법을 구현해야합니다. 이 예제에서처럼 메소드 호출을 정적으로 매개 변수화하는 대신 서명을 동적으로 검사 할 수도 있습니다.

최종 솔루션이 아닌 프레임 워크를 만들 때만 이러한 종류의 코드를 사용할 수 있습니다. 최종 soultions에서 당신은 당신이 전화하고있는 것을 정확히 알고 당신이 기대하는 입력과 출력으로 준비되어 있어야합니다.

package com.something; 

import java.lang.reflect.Method; 

public class Test { 

public void someMethod() { 
    System.out.println("This does nothing"); 
} 

public String anotherMethod(String param) { 
    return "This does something with your param: " + param; 
} 

public static class InnerTest { 

    public double thirdMethod() { 
     return Math.random(); 
    } 

} 

public static void main(String[] args) throws Exception { 

    Class[] clazzArr = new Class[2]; 

    clazzArr[0] = Test.class; 
    clazzArr[1] = Test.InnerTest.class; 

    for (Class auxClass : clazzArr) { 
     for (Method auxMethod : auxClass.getMethods()) { 
      // inspect these to know what you must send to current parameter to be able to invoke it 
      Object[] parameterTypes = auxMethod.getParameterTypes(); 
      // inspect this to know what type of object do you expect 
      Object returnType = auxMethod.getReturnType(); 

      // for simplicity, I know which parameters to send in my example 
      switch(auxMethod.getName()) { 
      case "someMethod": 
       // I know it doesn't receive any parameters 
       auxMethod.invoke(auxClass.newInstance(), new Object[0]); 
       break; 
      case "anotherMethod": 
       // I know it does receive an string parameter and I know it doesn't print anything, 
       // so I have to print it here 
       System.out.println(auxMethod.invoke(auxClass.newInstance(), "My Name is Imago")); 
       break; 
      case "thirdMethod": 
       // in the other method I just return a double with no parameters 
       System.out.println("Random number: " + auxMethod.invoke(auxClass.newInstance(), new Object[0])); 
      default: 
       // even public static void main and other Object methods will be included, you must have another algorithm to include only desired ones 
       break; 
      } 
     } 
    } 

} 

}

옆 독서에 관심이있을 수 있습니다

Java Reflection

Java Reflection: Method

관련 문제