자바 : 참조를 전달하는 정적 intead를 선언하지 않는 이유는 무엇입니까?

PH- 제로

보석을 수집해야하는 게임을 만들고 싶다고 가정 해 보겠습니다. 따라서 Gem 클래스, GemSpawner 클래스 및 MainActivity 클래스가 필요합니다.

public class MainActivity {
    public static void main(String[] args) {

        List<Gem> gems = new ArrayList<Gem>();

        GemSpawner gs = new GemSpawner(gems);

        //...
    }
}

이 경우에는 gem으로 List를 만들고 생성자를 통해 GemSpawner에 전달했습니다. 따라서 gs는 다음을 사용하여 목록에 gem을 추가 할 수 있습니다.

gems.add(new Gem(10, 50, "red")); //should represent Xpos, Ypos, and color.

그러나 이것이 더 좋지 않을까요?

public class MainActivity {

    public static List<Gem> gems = new ArrayList<Gem>();

    public static void main(String[] args) {

        GemSpawner gs = new GemSpawner();

        //...
    }
}

이제 GemSpawner (gs)는 다음을 사용하여 gem을 추가 할 수 있습니다.

MainActivity.gems.add(new Gem(10, 50, "red"));

친구가 위의 방법 만 보여주고 설명해 줬는데 아래 방법이 훨씬 더 효율적이지 않나요?

거미 보리스

이것은 당신이 생각하는 것보다 훨씬 더 복잡한 질문입니다.

Java로 작성을 시작하는 많은 사람들이 static참조를 전달할 필요가 없기 때문에 모든 것을 정확하게 만들기 시작 합니다. 이는 코드를 "단순"하게 만듭니다.

그러나 코드가 더 복잡해지면 문제가 발생하기 시작합니다. 이러한 문제가 발생하는 세 가지 주요 라인이 있습니다.

  1. 캡슐화
  2. 추출
  3. 테스팅

캡슐화

이것은에서 Object구성원에게 직접 액세스를 허용해서는 안되며 "일을 수행"하도록 지시 한 다음 이것이 수행되는 방식을 노출하지 않고 내부적으로 수행한다는 아이디어입니다 .

이것의이면에있는 아이디어는 클래스를 서로 너무 밀접하게 연결하지 않으려 고 노력한다는 것입니다.

이것은 우리를 다음 지점으로 인도합니다.

추출

Java에서는 abstract클래스 및 interfaces.

당신 GemSpawner은 보석을 생성하는 무언가의 정의 일 뿐이 라는 생각 입니다. 내부적으로이를 수행하는 방법은 실제로 누구의 일이 아니라 자신의 일입니다.

Java에서는 static상속에 대한 핵심 OO 아이디어로 메소드를 실제로 조정할 수 없습니다 .

static 메서드는 상속되지만 재정의되지 않고 음영 처리되므로 동작을 (쉽게) 수정할 수 없습니다.

그리고 이것은 우리를

테스팅

이것은 프로그램이 복잡 해짐에 따라 점점 더 많이 나타나는 주제입니다.

"Hello World"프로그램을 어떻게 테스트합니까? 글쎄, 당신은 그것을 실행하고 "Hello Wrld"가 인쇄되는지 확인합니다.이 경우 버그가 있습니다.

프로그램이 더 복잡해지면 단순히 이렇게 할 수 없습니다. 프로그램을 분리하고 "단위"를 테스트해야합니다. 로 알려진 단위 테스트 .

여기서 당신의 static참조는 실제로 문제를 일으키기 시작합니다. 모든 것이 직접 클래스 참조를 통해 함께 연결되므로 프로그램을 개별 단위로 분리 할 수 ​​없습니다. 그리고 static쉽게 재정의되지 않기 때문에 메서드 의 동작을 조롱 할 수 없습니다 .

그래서 요약하자. 예; static참조를 전달하지 않고 모든 곳에 배치하는 것이 더 빠르고 쉬울 수 있습니다. 그러나 게임처럼 복잡한 것을 작성할 계획이라면 Java를 최대한 활용하는 것을 고려해야합니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

'선택적 바인딩'의 재 선언이 오류를 생성하지 않는 이유는 무엇입니까?

분류에서Dev

존재하지 않는 정적 nuxt 자산을 참조하는 이미지가 @error를 트리거하지 않는 이유는 무엇입니까?

분류에서Dev

C ++ 전달 참조로 noexcept를 올바르게 지정하는 방법은 무엇입니까?

분류에서Dev

내 자바 스크립트가 잘못된 정보를 전달하는 이유는 무엇입니까?

분류에서Dev

약한 참조를 함수 호출자에게 올바르게 전달하는 방법은 무엇입니까?

분류에서Dev

약한 자체를 정적 함수의 클로저로 전달하는 것에서 유지주기가 발생하는 이유는 무엇입니까?

분류에서Dev

가변 배열 참조도받는 함수에 가변 배열 참조를 전달할 때 & mut이 지정되지 않은 이유는 무엇입니까?

분류에서Dev

이동 생성자에서 rvalue 참조를 null로 설정해야하는 이유는 무엇입니까?

분류에서Dev

내 기능이 올바른 경로를 참조하지 않는 이유는 무엇입니까?

분류에서Dev

이 perl 정규식이 역 참조를 캡처하지 않는 이유는 무엇입니까?

분류에서Dev

왜 자바를 확인한 후 유형을 가정하지 않는 이유는 무엇입니까?

분류에서Dev

재귀 적 방법의 HashMap를 전달하면 작동하지 않는 이유는 무엇입니까?

분류에서Dev

선언되지 않은 식별자를 사용하는 이유는 무엇입니까?

분류에서Dev

인수로 전달 된 참조가 함수를 통해 변수를 수정하는 데 작동하는 이유는 무엇입니까?

분류에서Dev

Clippy가 Arc를 참조로 전달하는 것을 제안하는 이유는 무엇입니까?

분류에서Dev

참조를 재설정 할 때 오류가 발생하지 않는 이유는 무엇입니까?

분류에서Dev

컴파일러가 선언적 매크로에 이중 대괄호를 자동으로 추가하지 않는 이유는 무엇입니까?

분류에서Dev

Kotlin / Android에서 '안정적인 참조'를 가져와야하는 이유는 무엇입니까?

분류에서Dev

shapeless.Generic을 사용할 때 '매개 변수가 이름으로 선언되지 않으면 수퍼 생성자가 자체 참조를 전달할 수 없습니다'라는 오류를 피하는 방법은 무엇입니까?

분류에서Dev

& var = var 유형 이외의 C ++에서 참조를 선언하는 몇 가지 방법은 무엇입니까?

분류에서Dev

정적 변수를 사용하지 않는 이유는 무엇입니까?

분류에서Dev

C ++ 참조를 사용하는 이유는 무엇입니까?

분류에서Dev

참조를 선언하고 참조로 전달하는 것과 동일하게 전달합니까?

분류에서Dev

이것이 전역 개체를 참조하는 이유는 무엇입니까?

분류에서Dev

이것이 전역 개체를 참조하는 이유는 무엇입니까?

분류에서Dev

연산자 + 오버로드가 참조로 전달 되었음에도 불구하고 복사 생성자를 호출하는 이유는 무엇입니까?

분류에서Dev

이 합성 함수가 참조로 전달 될 때 잘못된 순서로 함수를 적용하는 이유는 무엇입니까?

분류에서Dev

Android에서 전역 적으로 선언하지 않고 OnCreate에서 OnListItemClick으로 변수를 전달하는 방법은 무엇입니까?

분류에서Dev

Swift에서 inout 함수를 참조하여 const 값을 전달할 수없는 이유는 무엇입니까?

Related 관련 기사

  1. 1

    '선택적 바인딩'의 재 선언이 오류를 생성하지 않는 이유는 무엇입니까?

  2. 2

    존재하지 않는 정적 nuxt 자산을 참조하는 이미지가 @error를 트리거하지 않는 이유는 무엇입니까?

  3. 3

    C ++ 전달 참조로 noexcept를 올바르게 지정하는 방법은 무엇입니까?

  4. 4

    내 자바 스크립트가 잘못된 정보를 전달하는 이유는 무엇입니까?

  5. 5

    약한 참조를 함수 호출자에게 올바르게 전달하는 방법은 무엇입니까?

  6. 6

    약한 자체를 정적 함수의 클로저로 전달하는 것에서 유지주기가 발생하는 이유는 무엇입니까?

  7. 7

    가변 배열 참조도받는 함수에 가변 배열 참조를 전달할 때 & mut이 지정되지 않은 이유는 무엇입니까?

  8. 8

    이동 생성자에서 rvalue 참조를 null로 설정해야하는 이유는 무엇입니까?

  9. 9

    내 기능이 올바른 경로를 참조하지 않는 이유는 무엇입니까?

  10. 10

    이 perl 정규식이 역 참조를 캡처하지 않는 이유는 무엇입니까?

  11. 11

    왜 자바를 확인한 후 유형을 가정하지 않는 이유는 무엇입니까?

  12. 12

    재귀 적 방법의 HashMap를 전달하면 작동하지 않는 이유는 무엇입니까?

  13. 13

    선언되지 않은 식별자를 사용하는 이유는 무엇입니까?

  14. 14

    인수로 전달 된 참조가 함수를 통해 변수를 수정하는 데 작동하는 이유는 무엇입니까?

  15. 15

    Clippy가 Arc를 참조로 전달하는 것을 제안하는 이유는 무엇입니까?

  16. 16

    참조를 재설정 할 때 오류가 발생하지 않는 이유는 무엇입니까?

  17. 17

    컴파일러가 선언적 매크로에 이중 대괄호를 자동으로 추가하지 않는 이유는 무엇입니까?

  18. 18

    Kotlin / Android에서 '안정적인 참조'를 가져와야하는 이유는 무엇입니까?

  19. 19

    shapeless.Generic을 사용할 때 '매개 변수가 이름으로 선언되지 않으면 수퍼 생성자가 자체 참조를 전달할 수 없습니다'라는 오류를 피하는 방법은 무엇입니까?

  20. 20

    & var = var 유형 이외의 C ++에서 참조를 선언하는 몇 가지 방법은 무엇입니까?

  21. 21

    정적 변수를 사용하지 않는 이유는 무엇입니까?

  22. 22

    C ++ 참조를 사용하는 이유는 무엇입니까?

  23. 23

    참조를 선언하고 참조로 전달하는 것과 동일하게 전달합니까?

  24. 24

    이것이 전역 개체를 참조하는 이유는 무엇입니까?

  25. 25

    이것이 전역 개체를 참조하는 이유는 무엇입니까?

  26. 26

    연산자 + 오버로드가 참조로 전달 되었음에도 불구하고 복사 생성자를 호출하는 이유는 무엇입니까?

  27. 27

    이 합성 함수가 참조로 전달 될 때 잘못된 순서로 함수를 적용하는 이유는 무엇입니까?

  28. 28

    Android에서 전역 적으로 선언하지 않고 OnCreate에서 OnListItemClick으로 변수를 전달하는 방법은 무엇입니까?

  29. 29

    Swift에서 inout 함수를 참조하여 const 값을 전달할 수없는 이유는 무엇입니까?

뜨겁다태그

보관