2015-01-03 5 views
0

객체 설정하지 않고 데이터를 변경 :전화 별도의 자바 클래스를 설정하거나 반환을 요구하거나 내가 메인 클래스에서 호출 java 파일에 자바 프로그램을 분할하기 위해 노력하고있어

public static void main(String[] args) { 
//Call code in a separate .java file which sets up an array of objects. 
//Call code to change the object values in a certain way i times 
//Call code to do some calculations 
//Call code to display some info 
} 

뭔가를하기 위해 별도의 코드를 호출하는 것과 광범위하게 필적하는 모든 지침은 객체 생성 (예 : MyObject myobject1 = new MyObject();); 또는 단순히 데이터를 생성하거나 변경하는 대신 반환 값 (예 : x=myMethod(datain);)을 가져 오는 것이 좋습니다.

내가 뭔가를 놓친, 또는 인위적으로 객체를 생성하거나 내 간단한 포트란에서

파생 Boolean datacreated = createMyData()으로 무의미 반환을받지 않고 같은 주 된 .java 파일에있는 모든 파일 생성/변경 코드를 넣어 피할 수있는 방법은 없습니다 되세요 세계 저는 다음과 같이 주 프로그램을 나눌 수있을 것입니다 :

call SetUpMyData 
call ChangeMyData 
call SomeOtherSub 
//etc 
+0

자바는 객체 지향 언어입니다. 자바에서 절차 적 방법을 에뮬레이션하려고 할 수는 있지만 관용적 인 자바는 아니다. –

+0

또한 의사 코드는 전달되는 데이터 구조를 표시하지 않고 메소드 호출 만 표시합니다.이것이 귀하의 프로그램이 로컬 데이터 구조를 사용하지 않고 전체 데이터로만 작동한다는 것을 의미하지는 않습니다. –

답변

0

와 함께 시작합니다. 모든 방법과 상태를 publicstatic으로 설정하십시오. 당신은 당신의 프로그램에 어디에서든 사용할 수 있습니다 :

public class Main { 
    public static int data[]; 

    public static void initialize() { 
     Main.data = new int[100]; 
    } 

    public static void print() { 
     System.out.println(Arrays.toString(Main.data)); 
    } 

    public static void main(String[] args) { 
     Main.print(); 
     Main.initialize(); 
    } 
} 

이 방법의 문제, 더 오류가 발생하기 쉽고 분석하기 힘들다는 것이다. 전역 변수를 피하면 컴파일러는 많은 실수를 범할 것입니다 :

public static int[] initialize() { 
    return new int[100]; 
} 

public static void print(int[] data) { 
    System.out.println(Arrays.toString(data)); 
} 

public static void main(String[] args) { 
    int data[]; 
    Main.print(data); // compile error - data is not initialized 
    data = Main.initialize(); 
} 
+0

스레드 안전성은 물론 ... –

0

글쎄, 방법이 있습니다. return 문이나 무엇이든 사용하지 않고 별도의 클래스에서 주 클래스의 변수를 변경하려면 전역 변수로 정의해야합니다. 이 같은 기본 방법 위를 생성하여이 작업을 수행 : 첫 번째 클래스에서 값을 변경하려는 SupportClass에서 다음

class Main { 
    public static int sampleNumber = 0; 
    public static String sampleString; 

    public static void main(String[] args) { 
     SupportClass.setVariables(); 
    } 
} 

, Classname.varaiblename로 참조 :

class SupportClass { 
    public static void setVariables() { 
     Main.sampleNumber = 20; 
     Main.sampleString = "This works!"; 
    } 
} 

그러나 모든 정직에서, 이것은 이것을하는 좋은 방법이 아닙니다. main 메소드를 어지럽히고 싶지 않은 경우, 메인 클래스의 맨 아래에 변수를 설정하는 도우미 메소드를 추가하십시오. 변수를 설정하는 일반적인 방법은 아닙니다.

0

글쎄, 당신이 할 수있는 일 중 일부는 더 많은 객체 지향적 인 사고로 바꿔야합니다. 여기에는 객체를 설정하는 생성자가 있습니다. 또는 동일한 데이터에서 작업하는 경우 동일한 객체에서 여러 mothod를 호출 할 수 있습니다.

main(String[] args) { 
    World world = new World(); // setup different fields 
    world.prepare(); // modify some fields 
    world.calculate(); 
    System.out.println(world.getResult()); // or world.printResult(); 
} 

싱글 톤이나 필드를 사용하여 일부 데이터 종속성을 숨길 수 있지만 프로그램을 따르기가 어려워서는 안됩니다. 당신이 서브 루틴에 더 큰 계산을 구성하려는 경우, 당신은 개인 방법과 동일한 기능을 수행 할 것

:

class MyExperiment { 
    long sum, a, b; 

    void doExperiment() { 
    init(); 
    simulate(); 
    printResults(); 
    } 

    private void init() { 
    a = 1; 
    b = 1; 
    } 

    private void simulate() { 
    sum = a + b; 
} 

private void printResult() { 
    System.out.println("sum=" + sum); 
} 
} 

당신은 당신은 확실히 프로그램이 방법을 쓸 수 new MyExperiment().doExperiment()

+0

이 eckes에 대한 많은 감사 (그리고 응답 한 다른 사람들에게) 나는 기본적으로 한 곳에서 수천 줄의 코드를 사용하지 않으려 고 노력하고 있지만 코드를 오류가 발생하기 쉽고 내 생각을 조정하려고한다는 점을 지적합니다. 일반적인 메시지는 코드 분할을 피하고주의해서해야한다는 것입니다. 한 가지 간단한 질문 : 위의 예에서 배열에 객체가 저장되어있는 경우 (예 : r [1], r [2] ... 등) 여기서 r [1] .x = x1, r [1] .y = y1 등) 루틴 simulate()가 r [1] .x, r [1] .y 등을 액세스/변경할 수 있도록 MyExperiment 클래스의 long 선언 다음에 r []을 어떻게 선언하겠습니까? – IslwynD

+0

확실하지는 않지만 클래스의 필드 정의는 정의 된 위치에 관계없이 해당 클래스의 모든 메소드에서 볼 수 있습니다. (물론 방법의 외부). (그리고 아뇨, 커다란 짤막하지 않은 코드는 좋은 생각이 아닙니다 :) – eckes

+0

좋아, 코드를 나누어야한다고 생각합니다.하지만 적절하지 않으면 다른 클래스에 넣지 마십시오. 나는 거기에 가고있다라고 생각한다! 다시 한번 감사드립니다. – IslwynD