비 정적 메소드에서 정적 메소드에 액세스하는 것이 왜 나쁜가요?
문제
NetBeans는 정적이 아닌 방법에서 정적 방법에 액세스하는 것이 좋지 않다고 말합니다. 이것이 왜 나쁘니? "정적 메소드 액세스"는 경고입니다.
import java.util.Calendar;
public class Clock
{
// Instance fields
private Calendar time;
/**
* Constructor. Starts the clock at the current operating system time
*/
public Clock()
{
System.out.println(getSystemTime());
}
private String getSystemTime()
{
return this.time.getInstance().get(Calendar.HOUR)+":"+
this.time.getInstance().get(Calendar.MINUTE);
}
}
해결책
직접 대신 인스턴스에서 정적 메소드에 액세스하고있을 것입니다. 사용해보십시오 Calendar.getInstance()
대신에:
private String getSystemTime()
{
return Calendar.getInstance().get(Calendar.HOUR)+":"+
Calendar.getInstance().get(Calendar.MINUTE);
}
다른 팁
"정적 방법을 반환"한다는 것은 무엇을 의미합니까? 물론 상황에 따라 내 관점에서 인스턴스 메소드에서 정적 메소드를 호출하는 것이 좋습니다. NetBeans가 불만을 제기하는 코드를 게시 할 수 있습니까?
한 가지 ~할 수 있었다 인스턴스의 데이터를 사용하지 않고 인스턴스 메소드에서 정적 메소드 만 사용하는 경우라고 상상해보십시오. 때로는 인터페이스를 구현하거나 기본 클래스에서 메소드를 재정의하는 데 필요한 것이지만 아무 것도 재정의하지 않고 인스턴스 변수를 사용하지 않는 경우 메소드가 정적으로 표시되는 것이 좋습니다. 특정 인스턴스에 따라 다릅니다.
편집 : 편집 된 질문으로 이것은 많은 의미가 있습니다. IMO는 자바가 처음에 허용하는 결함입니다. 매우 오해의 소지가있는 코드를 만들 수 있습니다. 내가 가장 좋아하는 예 (구식 시간이 내가 전에 게시 한 것을 본 적이 있음을 의미합니다 :) Thread.sleep
. 무엇을합니까 바라보다 이 코드처럼?
Thread t = new Thread(someRunnable);
t.start();
t.sleep(1000);
내 마음에 새 스레드가 잠을 자도록 요청하는 것처럼 보입니다. suspend
. 그러나 아니요 - 현재 실행중인 스레드를 수면을 요청할 수 있습니다. Thread.sleep
정적 방법입니다. 위의 코드는 합법적 인 Java이며, 새로 생성 된 스레드 (아마도)가 실행되는 동안 현재 실행중인 스레드가 잠을 자게 만들 것입니다.
주문이 반전 되었습니까? 그렇다면 정적 메소드에서 비 정적 메소드에 액세스 할 수 없다는 것이 합리적입니다. 그렇지 않다면 왜 이것이 나쁜지 알고 싶습니다!
정적이 아닌 방법은 정적 컨텍스트에서 참조 할 수 없습니다. 정적 메소드는 비 정적 컨텍스트에서 참조 할 수 있습니다.
NetBeans 오류입니까 아니면 경고입니까? 원인이되는 코드를 게시 할 수 있습니까?
전화하는 것은 괜찮습니다 time.getInstance()
. 컴파일러는 변수의 유형을 살펴 봅니다. Calendar
이 경우 방법을 호출하십시오. 결국 정확히 컴파일됩니다 Calendar.getInstance()
. 실제 값의 값 time
이것에 기여하지 않습니다. 즉 null
그리고 그것은 중요하지 않습니다.
눈살을 찌푸린 정기적 인 방법과의 차이입니다. 직접 표현하는 것이 가장 좋습니다 Calendar.getInstance()
.
간단하게 설명하지 않는 이유 :
Nonstatic Method를 호출하는 경우 1) a = new Class ()로 새 인스턴스를 만듭니다. 2) 그런 다음 호출 방법 A.Method;
정적 메소드를 호출하는 경우 : 1) Class.Method라고 부릅니다.
수업 내에서 독립적이며 전화에 필요한 모든 것이 있기 때문에 정적 방법으로 수행 할 수 있습니다. 다른 정보 (생성자)에 의존하면 정적을 선언하지 않으면 실패합니다.
Java에서는 모든 정적 멤버 변수가 먼저 메모리에로드되면 모든 정적 멤버가로드됩니다. 그 후에는 비 정적 변수와 멤버 함수가 메모리에로드되면 정적 메인 블록이 실행됩니다. .