[java] Java : 정적 메소드 사용시기

정적 메소드를 언제 사용해야하는지 궁금합니다. getter와 setter가 몇개 인 클래스, 메소드 또는 두 개가 있고 클래스의 인스턴스 객체에서만 해당 메소드를 호출 할 수 있기를 원한다고 가정하십시오. 이것이 정적 메소드를 사용해야 함을 의미합니까?

예 :

Obj x = new Obj();
x.someMethod

또는

Obj.someMethod

(정적 인 방법입니까?)

오히려 혼란 스러워요!



답변

하나의 규칙 : “자체가 아직 구성되지 않은 경우에도이 메서드를 호출하는 것이 합리적입니까?” 그렇다면 확실히 정적이어야합니다.

따라서 클래스 Car에는 메소드가있을 수 있습니다.

double convertMpgToKpl(double mpg)

… 누구도 빌드하지 않은 경우에도 35mpg가 변환되는 것을 알고 싶을 수 있기 때문에 정적 Car입니다. 그러나이 방법 (특정의 효율성을 설정 Car) :

void setMileage(double mpg)

Car어떻게 구성 되기 전에 메소드를 호출 할 수 없기 때문에 정적 일 수 없습니다 .

(그렇지만, 그 반대는 항상 사실이 아닙니다. 때로는 두 개의 Car객체 를 포함하는 메소드가있을 수 있으며 여전히 정적이기를 원할 수 있습니다.

Car theMoreEfficientOf( Car c1, Car c2 )

이것은 비 정적 버전으로 변환 될 수 있지만 일부는 “권한있는”선택 Car이 더 중요하지 않기 때문에 호출자가 Car호출 할 객체로 하나를 선택하도록 강요해서는 안된다고 주장 합니다 방법에. 이 상황은 모든 정적 메소드 중 상당히 작은 부분을 차지합니다.)


답변

다음 시나리오에서만 정적 메소드를 정의하십시오.

  1. 유틸리티 클래스를 작성 중이고 변경되지 않아야하는 경우
  2. 메소드가 인스턴스 변수를 사용하지 않는 경우
  3. 작업이 인스턴스 생성에 의존하지 않는 경우.
  4. 모든 인스턴스 메소드가 쉽게 공유 할 수있는 코드가 있으면 해당 코드를 정적 메소드로 추출하십시오.
  5. 메소드 정의가 절대 변경되거나 대체되지 않을 것이라고 확신하는 경우. 정적 메서드는 재정의 할 수 없습니다.

답변

정적 메소드를 사용해야하는 몇 가지 유효한 이유가 있습니다.

  • 성능 : 일부 코드를 실행하고 추가 객체를 인스턴스화하지 않으려면 정적 메소드로 입력하십시오. JVM은 또한 정적 메소드를 많이 최적화 할 수 있습니다 (정적 메소드는 빠르지 만 소스를 찾을 수 없으므로 JVM에서 사용자 정의 명령이 필요하지 않다고 선언하는 James Gosling을 읽었습니다. 그것은 완전히 거짓 일 수 있습니다). 그렇습니다. 미세 최적화이며 필요하지 않을 것입니다. 그리고 우리 프로그래머들은 필요하지 않은 것들이 시원하기 때문에 절대하지 않습니다.

  • 실용성 : new Util().method(arg), call Util.method(arg)또는 method(arg)정적 가져 오기 대신에 . 더 쉽고 짧습니다.

  • 메소드 추가 : 실제로 클래스 클래스에 removeSpecialChars()인스턴스 메소드 를 갖기를 원했지만 거기에 없습니다 (프로젝트의 특수 문자가 다른 프로젝트의 문자와 다를 수 있기 때문에), 추가 할 수 없습니다 (Java 이후) 제정신입니다), 그래서 당신은 유틸리티 클래스를 만들고 removeSpecialChars(s)대신에 호출s.removeSpecialChars() . 단.

  • 순도 : 몇 가지 예방 조치를 취하면 정적 메소드는 순수한 함수가됩니다 . 즉, 의존하는 유일한 것은 매개 변수입니다. 데이터 입력, 데이터 출력 상속에 대한 걱정이 없기 때문에 읽기 쉽고 디버그하기 쉽습니다. 인스턴스 메소드로도 수행 할 수 있지만 컴파일러는 정적 메소드 (인스턴스 속성에 대한 참조를 허용하지 않거나 메소드를 재정의하는 등)를 사용하여 조금 더 도움을 줄 것입니다.

싱글 톤을 만들려면 정적 메서드를 만들어야하지만 그렇지 않습니다. 두 번 생각하십시오.

더 중요한 것은 정적 메서드를 만들고 싶지 않습니까? 기본적으로 다형성은 창 밖으로 나옵니다 . 메소드를 재정의 하거나 인터페이스 (Java 8 이전) 에서 선언 할 수 없습니다 . 디자인에서 많은 유연성이 필요합니다. 또한 state 가 필요한 경우 조심하지 않으면 많은 동시성 버그 및 / 또는 병목 현상이 발생합니다.


답변

Misko의 기사를 읽은 후 정적 관점은 테스트 관점에서 좋지 않다고 생각합니다 . 대신 팩토리 가 있어야 합니다 ( Guice 와 같은 종속성 주입 도구를 사용 중일 수 있습니다 ).

내가 하나만 가지고 있는지 어떻게 확인합니까?

“내가 하나만 가지고 있는지 확인하는 방법”이라는 문제는 아주 좋은 단계입니다. 기본에서 단일 ApplicationFactory 만 인스턴스화하고 결과적으로 모든 싱글 톤의 단일 인스턴스 만 인스턴스화합니다.

정적 메소드의 기본 문제는 절차 코드입니다.

정적 메서드의 기본 문제는 절차 코드라는 것입니다. 절차 코드를 단위 테스트하는 방법을 모르겠습니다. 단위 테스트에서는 응용 프로그램을 개별적으로 인스턴스화 할 수 있다고 가정합니다. 인스턴스화하는 동안 실제 종속성을 대체하는 모의 / 친구와 종속성을 연결합니다. 절차 적 프로그래밍을 사용하면 객체가 없으므로 코드와 데이터가 분리되므로 “와이어”가 없습니다.


답변

static방법은 호출 할 수 있도록 모든 개체를 필요로하지 않는 방법의 한 가지 유형의 초기화 할 것입니다. Java staticmain함수에서 사용되는 것을 보셨습니까 ? 객체가 생성되지 않은 상태에서 프로그램 실행이 시작됩니다.

다음 예제를 고려하십시오.

 class Languages
 {
     public static void main(String[] args)
     {
         display();
     }

     static void display()
     {
         System.out.println("Java is my favorite programming language.");
     }
  }


답변

java의 정적 메소드는 클래스가 아닙니다 (인스턴스 아님). 그들은 인스턴스 변수를 사용하지 않으며 일반적으로 매개 변수에서 입력을 받아 조치를 수행 한 다음 결과를 반환합니다. 인스턴스 메소드는 오브젝트와 연관되며 이름에서 알 수 있듯이 인스턴스 변수를 사용할 수 있습니다.


답변

정적 메소드는 인스턴스와 연관되지 않습니다. 그들은 수업에 속합니다. 정적 메소드는 두 번째 예입니다. 인스턴스 메소드가 첫 번째입니다.