비 정적 메소드에서 정적 메소드에 액세스하는 것이 왜 나쁜가요?

StackOverflow https://stackoverflow.com/questions/405336

  •  03-07-2019
  •  | 
  •  

문제

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에서는 모든 정적 멤버 변수가 먼저 메모리에로드되면 모든 정적 멤버가로드됩니다. 그 후에는 비 정적 변수와 멤버 함수가 메모리에로드되면 정적 메인 블록이 실행됩니다. .

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top