정적 메소드를 언제 사용해야하는지 궁금합니다. 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
호출 할 객체로 하나를 선택하도록 강요해서는 안된다고 주장 합니다 방법에. 이 상황은 모든 정적 메소드 중 상당히 작은 부분을 차지합니다.)
답변
다음 시나리오에서만 정적 메소드를 정의하십시오.
- 유틸리티 클래스를 작성 중이고 변경되지 않아야하는 경우
- 메소드가 인스턴스 변수를 사용하지 않는 경우
- 작업이 인스턴스 생성에 의존하지 않는 경우.
- 모든 인스턴스 메소드가 쉽게 공유 할 수있는 코드가 있으면 해당 코드를 정적 메소드로 추출하십시오.
- 메소드 정의가 절대 변경되거나 대체되지 않을 것이라고 확신하는 경우. 정적 메서드는 재정의 할 수 없습니다.
답변
정적 메소드를 사용해야하는 몇 가지 유효한 이유가 있습니다.
-
성능 : 일부 코드를 실행하고 추가 객체를 인스턴스화하지 않으려면 정적 메소드로 입력하십시오. JVM은 또한 정적 메소드를 많이 최적화 할 수 있습니다 (정적 메소드는 빠르지 만 소스를 찾을 수 없으므로 JVM에서 사용자 정의 명령이 필요하지 않다고 선언하는 James Gosling을 읽었습니다. 그것은 완전히 거짓 일 수 있습니다). 그렇습니다. 미세 최적화이며 필요하지 않을 것입니다. 그리고 우리 프로그래머들은 필요하지 않은 것들이 시원하기 때문에 절대하지 않습니다.
-
실용성 :
new Util().method(arg)
, callUtil.method(arg)
또는method(arg)
정적 가져 오기 대신에 . 더 쉽고 짧습니다. -
메소드 추가 : 실제로 클래스 클래스에
removeSpecialChars()
인스턴스 메소드 를 갖기를 원했지만 거기에 없습니다 (프로젝트의 특수 문자가 다른 프로젝트의 문자와 다를 수 있기 때문에), 추가 할 수 없습니다 (Java 이후) 제정신입니다), 그래서 당신은 유틸리티 클래스를 만들고removeSpecialChars(s)
대신에 호출s.removeSpecialChars()
. 단. -
순도 : 몇 가지 예방 조치를 취하면 정적 메소드는 순수한 함수가됩니다 . 즉, 의존하는 유일한 것은 매개 변수입니다. 데이터 입력, 데이터 출력 상속에 대한 걱정이 없기 때문에 읽기 쉽고 디버그하기 쉽습니다. 인스턴스 메소드로도 수행 할 수 있지만 컴파일러는 정적 메소드 (인스턴스 속성에 대한 참조를 허용하지 않거나 메소드를 재정의하는 등)를 사용하여 조금 더 도움을 줄 것입니다.
싱글 톤을 만들려면 정적 메서드를 만들어야하지만 그렇지 않습니다. 두 번 생각하십시오.
더 중요한 것은 왜 정적 메서드를 만들고 싶지 않습니까? 기본적으로 다형성은 창 밖으로 나옵니다 . 메소드를 재정의 하거나 인터페이스 (Java 8 이전) 에서 선언 할 수 없습니다 . 디자인에서 많은 유연성이 필요합니다. 또한 state 가 필요한 경우 조심하지 않으면 많은 동시성 버그 및 / 또는 병목 현상이 발생합니다.
답변
Misko의 기사를 읽은 후 정적 관점은 테스트 관점에서 좋지 않다고 생각합니다 . 대신 팩토리 가 있어야 합니다 ( Guice 와 같은 종속성 주입 도구를 사용 중일 수 있습니다 ).
내가 하나만 가지고 있는지 어떻게 확인합니까?
“내가 하나만 가지고 있는지 확인하는 방법”이라는 문제는 아주 좋은 단계입니다. 기본에서 단일 ApplicationFactory 만 인스턴스화하고 결과적으로 모든 싱글 톤의 단일 인스턴스 만 인스턴스화합니다.
정적 메소드의 기본 문제는 절차 코드입니다.
정적 메서드의 기본 문제는 절차 코드라는 것입니다. 절차 코드를 단위 테스트하는 방법을 모르겠습니다. 단위 테스트에서는 응용 프로그램을 개별적으로 인스턴스화 할 수 있다고 가정합니다. 인스턴스화하는 동안 실제 종속성을 대체하는 모의 / 친구와 종속성을 연결합니다. 절차 적 프로그래밍을 사용하면 객체가 없으므로 코드와 데이터가 분리되므로 “와이어”가 없습니다.
답변
static
방법은 호출 할 수 있도록 모든 개체를 필요로하지 않는 방법의 한 가지 유형의 초기화 할 것입니다. Java static
의 main
함수에서 사용되는 것을 보셨습니까 ? 객체가 생성되지 않은 상태에서 프로그램 실행이 시작됩니다.
다음 예제를 고려하십시오.
class Languages
{
public static void main(String[] args)
{
display();
}
static void display()
{
System.out.println("Java is my favorite programming language.");
}
}
답변
java의 정적 메소드는 클래스가 아닙니다 (인스턴스 아님). 그들은 인스턴스 변수를 사용하지 않으며 일반적으로 매개 변수에서 입력을 받아 조치를 수행 한 다음 결과를 반환합니다. 인스턴스 메소드는 오브젝트와 연관되며 이름에서 알 수 있듯이 인스턴스 변수를 사용할 수 있습니다.
답변
정적 메소드는 인스턴스와 연관되지 않습니다. 그들은 수업에 속합니다. 정적 메소드는 두 번째 예입니다. 인스턴스 메소드가 첫 번째입니다.