2012-04-19 2 views
-5

클래스에서는 대개 전역 변수와 지역 변수를 선언합니다. 나는 전역 변수, 세터, getter를 선언하는 것으로 대부분의 시간을 보았습니다. 이러한 것들을 사용하지 않고 구현할 수 있다면 괜찮습니까?클래스에서 전역 변수를 선언하거나 Java 클래스에서 로컬 변수를 선언하면 어느 것이 더 낫습니까?

+1

그들은 다른 일을합니다. 어떤게 더 좋아? 차나 기차? – SLaks

+1

@SLaks, 분명히 곰이 우수합니다! – Jakub

+0

작업에 적합한 도구를 사용하기 만하면됩니다. – BalusC

답변

3

일반적으로 당신은 항상,

그래서 변수, 메소드, 클래스 등의 가시성의 범위를 줄이기 위해 시도해야 당신은에 지역 변수 및 방법 인수를 사용하는 하나의 호출 순서에 사용되는 몇 가지 변수를 필요로하는 경우 메소드에서 메소드로 값을 전달하십시오.

public void foo() { 
    bar(); 
} 
private void bar() { 
} 

이의이 일부 접미사를 추가 동일한 문자열에 두 작품을 가정 해 봅시다 : 예를 들어 나는이 방법 foo()bar() foo 동안 통화 bar 있습니다.다음 예에서와 같이 지역 변수를 사용할 수 있습니다

public String foo(String s) { 
    s += "foo1" 
    bar(s); 
    s += "foo2" 
    return s; 
} 
private String bar(String s) { 
    s += "bar1" 
    return s; 
} 

또는 클래스 수준 변수 :

  1. 이 캡슐화되어 있기 때문에

    private String s; 
    
    public String foo() { 
        s += "foo1" 
        bar(); 
        s += "foo2" 
        return s; 
    } 
    private String bar() { 
        s += "bar1" 
        return s; 
    } 
    

    첫 번째 방법은 더 나은입니다. 아무도 구현 세부 사항을 알지 못합니다. 아무도 외부에서 영향을 줄 수 없습니다.

  2. 읽기 쉽습니다. 어떤 개체가 구현에 참여했는지 이해하기 위해 코드를 앞뒤로 이동할 필요가 없습니다.
  3. 동기화 된 블록이나 원자 변수와 같은 추가 작업없이 스레드로부터 안전합니다. 객체 수준 변수를 사용하지 않기 때문입니다.

두 번째 구현은 캡슐화되지 않았습니다. 개체 상태를 변경하고 다음 호출에 영향을 미치는 코드를 foo()에 추가 할 수 있습니다. 알고리즘과 알고리즘의 영향을받는 변수를 모두 이해하기 위해서는 앞뒤로 돌아 가야합니다. 스레드로부터 안전하지는 않습니다. 동일한 코드를 실행하는 두 개의 동시 스레드가 동일한 변수를 변경하려고 경쟁 할 수 있습니다.

1

전역 변수 란 클래스 멤버 필드를 의미합니까? 변수가 메소드의 범위 내에서만 사용되는 경우에는 로컬 변수 여야합니다. 변수가 본질적으로 전체 클래스 인스턴스에 대한 상태 정보를 가지고 있다면 클래스 멤버 필드로 선언되어야합니다 (setters 및 getters -이 필드에 다른 클래스에 대한 액세스 권한을 부여해야하는 경우). 자바 클래스에

좋은 요약은 여기에 있습니다 : 당신이 (메소드의 컨텍스트 외부에서 정의) 멤버 필드 변수로 "전역 변수"를 정의하는 같은데요 http://docs.oracle.com/javase/tutorial/java/javaOO/summaryclasses.html

+0

-1. 필요하지 않은 경우 게터를 제공하지 마십시오. 그리고 더 중요한 것은 필요하지 않다면 세터를 제공하지 말고 속성을 수정하는 것이 의미있는 경우에만 제공하십시오. –

+0

@JBNizet 마이너스 -1 제발 세터와 게터가 내 대답의 주요 포인트 였기 때문에 (그들은 그렇지 않았습니다!) – maksimov

+0

괄호 사이에 답의 마지막 부분을 제거한 경우에는 취소하지 않을 것입니다. 이것은 모든 분야가 항상 getter와 setter를 가져야한다고 생각하게 만듭니다. 이것은 많은 newbies가하는 큰 실수입니다. –

1

. 멤버 필드를 사용할 때는 뮤 테이터 (세터)와 접근 자 (게터)를 사용하여 구현을 쉽게 변경할 수 있습니다. 하나의 좋은 예는 변수 상태를 가져 오거나 설정할 때 필드 주위의 조건을 확인하는 경우 변경 사항을 사용할 때마다 변경 사항을 한 곳에서 캡슐화 할 수 있다는 것입니다.

0

Java에는 전역 변수가 없습니다.

필드는 개체의 속성 인 경우에만 존재해야합니다. 예를 들어, 객체의 두 메소드 호출 사이에 중간 결과를 저장하는 데 사용해서는 안됩니다.

Getter는 외부 세계가 정보에 액세스해야하는 경우에만 정의해야합니다. 필요하지 않은 경우 getter를 정의하지 마십시오. 클래스가 다른 클래스에 영향을 미치지 않고 호출 할 수 있기 때문에 더 많은 개인 상태가 가장 좋습니다.

필드의 수정이 필요한 경우 및이 필드를 다른 필드와 별도로 수정하는 것이 바람직한 경우에만 설정자를 수정해야합니다.

좋은 규칙 :

  • 적은 상태가 변경 가능한 상태보다 더 나은
  • 불변의 상태가 더 상태보다 더 나은 방법은 항상 다른 안정된 일관성있는 상태로 안정적으로 일관성있는 상태에서 개체를 지참
  • .
관련 문제