클래스에서는 대개 전역 변수와 지역 변수를 선언합니다. 나는 전역 변수, 세터, getter를 선언하는 것으로 대부분의 시간을 보았습니다. 이러한 것들을 사용하지 않고 구현할 수 있다면 괜찮습니까?클래스에서 전역 변수를 선언하거나 Java 클래스에서 로컬 변수를 선언하면 어느 것이 더 낫습니까?
답변
일반적으로 당신은 항상,
그래서 변수, 메소드, 클래스 등의 가시성의 범위를 줄이기 위해 시도해야 당신은에 지역 변수 및 방법 인수를 사용하는 하나의 호출 순서에 사용되는 몇 가지 변수를 필요로하는 경우 메소드에서 메소드로 값을 전달하십시오.
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;
}
또는 클래스 수준 변수 :
- 이 캡슐화되어 있기 때문에
private String s; public String foo() { s += "foo1" bar(); s += "foo2" return s; } private String bar() { s += "bar1" return s; }
첫 번째 방법은 더 나은입니다. 아무도 구현 세부 사항을 알지 못합니다. 아무도 외부에서 영향을 줄 수 없습니다.
- 읽기 쉽습니다. 어떤 개체가 구현에 참여했는지 이해하기 위해 코드를 앞뒤로 이동할 필요가 없습니다.
- 동기화 된 블록이나 원자 변수와 같은 추가 작업없이 스레드로부터 안전합니다. 객체 수준 변수를 사용하지 않기 때문입니다.
두 번째 구현은 캡슐화되지 않았습니다. 개체 상태를 변경하고 다음 호출에 영향을 미치는 코드를 foo()
에 추가 할 수 있습니다. 알고리즘과 알고리즘의 영향을받는 변수를 모두 이해하기 위해서는 앞뒤로 돌아 가야합니다. 스레드로부터 안전하지는 않습니다. 동일한 코드를 실행하는 두 개의 동시 스레드가 동일한 변수를 변경하려고 경쟁 할 수 있습니다.
전역 변수 란 클래스 멤버 필드를 의미합니까? 변수가 메소드의 범위 내에서만 사용되는 경우에는 로컬 변수 여야합니다. 변수가 본질적으로 전체 클래스 인스턴스에 대한 상태 정보를 가지고 있다면 클래스 멤버 필드로 선언되어야합니다 (setters 및 getters -이 필드에 다른 클래스에 대한 액세스 권한을 부여해야하는 경우). 자바 클래스에
좋은 요약은 여기에 있습니다 : 당신이 (메소드의 컨텍스트 외부에서 정의) 멤버 필드 변수로 "전역 변수"를 정의하는 같은데요 http://docs.oracle.com/javase/tutorial/java/javaOO/summaryclasses.html
-1. 필요하지 않은 경우 게터를 제공하지 마십시오. 그리고 더 중요한 것은 필요하지 않다면 세터를 제공하지 말고 속성을 수정하는 것이 의미있는 경우에만 제공하십시오. –
@JBNizet 마이너스 -1 제발 세터와 게터가 내 대답의 주요 포인트 였기 때문에 (그들은 그렇지 않았습니다!) – maksimov
괄호 사이에 답의 마지막 부분을 제거한 경우에는 취소하지 않을 것입니다. 이것은 모든 분야가 항상 getter와 setter를 가져야한다고 생각하게 만듭니다. 이것은 많은 newbies가하는 큰 실수입니다. –
. 멤버 필드를 사용할 때는 뮤 테이터 (세터)와 접근 자 (게터)를 사용하여 구현을 쉽게 변경할 수 있습니다. 하나의 좋은 예는 변수 상태를 가져 오거나 설정할 때 필드 주위의 조건을 확인하는 경우 변경 사항을 사용할 때마다 변경 사항을 한 곳에서 캡슐화 할 수 있다는 것입니다.
Java에는 전역 변수가 없습니다.
필드는 개체의 속성 인 경우에만 존재해야합니다. 예를 들어, 객체의 두 메소드 호출 사이에 중간 결과를 저장하는 데 사용해서는 안됩니다.
Getter는 외부 세계가 정보에 액세스해야하는 경우에만 정의해야합니다. 필요하지 않은 경우 getter를 정의하지 마십시오. 클래스가 다른 클래스에 영향을 미치지 않고 호출 할 수 있기 때문에 더 많은 개인 상태가 가장 좋습니다.
필드의 수정이 필요한 경우 및이 필드를 다른 필드와 별도로 수정하는 것이 바람직한 경우에만 설정자를 수정해야합니다.
좋은 규칙 :
- 적은 상태가 변경 가능한 상태보다 더 나은
- 불변의 상태가 더 상태보다 더 나은 방법은 항상 다른 안정된 일관성있는 상태로 안정적으로 일관성있는 상태에서 개체를 지참 .
- 1. 어느 쪽이 더 낫습니까? Ruby에서 인스턴스 변수를 생성하거나 로컬 변수를 전달하는 방법은 무엇입니까?
- 2. 어느 것이 실제 버블 정렬이고 어느 것이 더 낫습니까?
- 3. 클래스에서 변수를 동적으로 가져옴
- 4. 스레드 또는 JMS 어느 것이 더 낫습니까?
- 5. iPhone과 Android를 비교하면 어느 것이 더 낫습니까?
- 6. 속도 최적화 - 어느 것이 더 낫습니까?
- 7. asp.net 2.0에서 어느 것이 더 낫습니까?
- 8. 가비지 수집기와 ARC. 어느 것이 더 낫습니까?
- 9. 동일한 클래스에서 jQuery에 변수를 전달합니다.
- 10. Java 클래스에서 다른 클래스 변수를 사용하려면 어떻게해야합니까?
- 11. PHP 클래스에서 언제 변수를 선언해야합니까?
- 12. 변수를 직접 참조하는 것보다 클래스에서 변수를 반환하는 함수를 사용하고 있습니까?
- 13. 안드로이드는 클래스에서 다시 변수를 전달합니다
- 14. QThread 기반 클래스에서 전역 변수를 사용할 수없는 이유는 무엇입니까?
- 15. 전역 변수를 정의하고 그 전역 변수를 초기화하는 것이 좋습니다.
- 16. 어느 것이 목록 항목에 사용하는 것이 더 낫습니까?
- 17. 어느 것이 viewstate에 데이터를 저장하는 것이 더 낫습니까?
- 18. 하위 클래스의 변수를 수퍼 클래스에서 어떻게 변경합니까?
- 19. 한 클래스에서 다른 클래스로 변수를 전송하는 Cocos2d
- 20. Java 내부 클래스에서 외부 클래스의 변수를 최종적으로 사용해야하는 이유는 무엇입니까?
- 21. Thrift와 RESTful 서비스 중 어느 것이 더 낫습니까?
- 22. 루아와 C++ 클래스에서 변수를 공유하는 방법은 무엇입니까?
- 23. 어느 쪽이 Java에서 더 낫습니까?
- 24. 비 정적 클래스에서 공용 변수를 사용하는 것이 좋지 않습니까?
- 25. 버튼을 만드는 것이 더 낫습니까?
- 26. 부모 클래스에서 만든 변수를 자식 클래스에서 사용하는 방법이 있습니까?
- 27. 다른 클래스에서 실행되는 블록에서 변수를 사용하는 ObjC
- 28. 전역 변수를 사용하여 프로그램을 작성하는 것이 더 안전합니까?
- 29. 다른 클래스에서 @transient 변수를 사용하려고 시도했습니다.
- 30. 모든 클래스에서 정적 변수를 설정하는 방법은 무엇입니까?
그들은 다른 일을합니다. 어떤게 더 좋아? 차나 기차? – SLaks
@SLaks, 분명히 곰이 우수합니다! – Jakub
작업에 적합한 도구를 사용하기 만하면됩니다. – BalusC