과부하가 실제로 Java의 메소드 매개 변수에 대한 기본값을 얻는 유일한 방법입니까?

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

  •  03-07-2019
  •  | 
  •  

문제

저는 Java를 처음 접했고 Python 및 PHP에서 기능 매개 변수의 기본값에 익숙합니다.

따라서 일부 값 만 설정하려는 약간 다른 상황에서 호출되도록 설계된 방법을 작성하는 습관이 있습니다. 예를 들어, 내 PHP 코드에서 이것은 객체 인스턴스에 약간 다른 속성을 제공하는 공장 메소드가있는 경우 일반적입니다.

Java에서는 모든 매개 변수를 기대하는 하나의 메소드와 일부 매개 변수를 기본값으로 설정하고 발신자가 제공 한 일부 매개 변수로 해당 메소드를 호출하는 몇 가지 과부하 변형이 있어야합니다. 글쎄요, 좋아하지만 때로는 내 신경에 빠질 수 있습니다.

나는 이것이 C ++ 및 Actionscript에 대한 간단한 여행에서 이미 나를 괴롭 혔음을 기억합니다. 이제 더 숙련 된 Java 개발자가 이에 대한 지름길이 있습니까?

기술적으로, 질문은 모든 게시물의 합에 의해 "예, 그것은"로 답변 된 것 같습니다. 다양한 대체 솔루션을 수집하기 위해 아래에 위키 게시물을 열었습니다. 원하는 경우 기여하십시오. 나는이 모든 것이 영감과 전형적인 Java 구조에 대한 학습 사례로 매우 도움이된다는 것을 알았습니다.

도움이 되었습니까?

해결책 6

"예, 그것은"를 제외하고는 다음과 같습니다.

비슷한 효과를 얻을 수 있습니다 varargs Paul Whelan이 제안한 바와 같이 또는 Jon Skeet이 제안한 적절한 기본값을 가진 필드로 매개 변수를 전달하는 추가 유형을 정의함으로써. Boris Pavlović는 그의 유형이 내부 정적 클래스가 될 수 있다고 덧붙였다.

단점 (이 전체 질문은 심각한 영향에 관한 것이 아니라 편리한 조정에 관한 것입니다) :

Varargs는 매우 유사한 형태와 이름 목록과 같이 대부분 동등한 의미를 가진 가변 길이의 값 목록을 전달하는 데 가장 적합한 것 같습니다. 질문에 명시된 목적에 사용된다면,이 방법은이를 해석하기 위해 목록에서 다양한 검사를 수행해야합니다.

매개 변수를 운반하는 특수 유형은 결과 유형이 단지 하나의 특정 방법으로 전달되는 것 외에 다른 용도로 사용하거나 더 복잡한 매개 변수 세트 인 경우 가장 유용한 것 같습니다. 2-4 개의 매개 변수가 있고 일부는 기본값이있을 수 있다면 여전히 과부하가 조금 더 편리 해 보이지만 개인 취향의 문제 일 수 있습니다.

다른 팁

또 다른 옵션은 빌더 패턴의 변형입니다. 모든 매개 변수를 나타내는 유형이 있으며 해당 유형의 인스턴스를 구성하고 (그에 따라 기본값을 기본값으로), 원하는 속성을 설정 한 다음 결과를 원래 방법으로 전달하거나 추가합니다. "매개 변수 유형"의 메소드는 귀하를위한 메소드를 호출합니다.

당신은 이것을 표준 라이브러리에서 볼 수 있습니다. ProcessBuilder 그리고 Process 클래스.

Varargs를 참조하십시오

http://www.java-tips.org/java-se-tips/java.lang/using-the-varargs-language-feature.html

(업데이트 된 URL; StackOverFlow가> 30 숯이 필요하기 때문에이 주석이 추가되었습니다)

이 더 간단하게 만들기 위해 기본값에 대한 주석과 과부하 메소드가있는 슈퍼 클래스를 생성하는 주석 프로세서를 만들었습니다. 예를 들어:

protected void process(
    Processor processor,
    String item,
    @Default("Processor.Size.LARGE") Size size,
    @Default("red") String color,
    @Default("1") int quantity) {
        ...
}

생성 (생성 된 슈퍼 클래스)

protected void process(sample.Processor processor, java.lang.String item)  {
    process(processor, item, Processor.Size.LARGE, "red", 1);
}
protected void process(sample.Processor processor, 
                       java.lang.String item, 
                       sample.Processor.Size size)  {
    process(processor, item, size, "red", 1);
}
protected void process(sample.Processor processor, 
                       java.lang.String item, 
                       sample.Processor.Size size, 
                       java.lang.String color)  {
    process(processor, item, size, color, 1);
}
protected abstract void process(sample.Processor processor, 
                                java.lang.String item, 
                                sample.Processor.Size size, 
                                java.lang.String color, 
                                int quantity) ;

보다 http://code.google.com/p/javadude/wiki/annotations-Scott

한 과정을 한 랑우지에서 다른 랑우지로 번역하려고 시도하는 것은 매우 어려울 수 있습니다. 다른 사람들이 지적했듯이, 당신이 원하는 것을 얻기 위해 약간의 일을 할 수는 있지만 ... Java가 Java에서 일할 때 더 나은 일을하도록 설계된 방식을 빨리 받아 들일 수 있습니다.

나는 PHP 작업을해야했다.

가장 큰 장애물은 정적 타이핑 일 것입니다. 당신이 그 일을하기 위해 노력할 수있는 것들이 있지만, 결국 그들은 매우 큰 해킹이 될 것입니다.

C ++의 초기에는 사람들이 C ++가 SmallTalk처럼 행동하도록 설득하려고 시도했습니다. 초기에 Java 사람들이 C ++ 지식을 가져 와서 Java에서 사용하려고 시도한 경우 ... 너무 잘 작동하지 않았습니다 (언어가 표면에서 매우 유사하기 때문에 두 배로 좌절합니다).

Java 코딩에 대한 조언은 PHP 개발자가 아닌 Java 개발자처럼 프로그래밍하는 법을 배웁니다.

즉각적인 문제의 경우, 다른 변수 세트가있는 동일한 종류의 객체를 만드는 대신 공장에서 다른 클래스를 실제로 재조정해야 할 수 있습니까?

OO 방식으로 코딩하는 한 Java의 기본값을 놓치지 않을 것입니다. 기본 인수는 절차 적 코딩 스타일로만 편리합니다.

OO에서는 방법/절차를 통해 상태를 통과하는 대신 상태는 이미 호출하는 객체 또는 매개 변수로 전달하는 객체에 있습니다. 대부분의 경우 메소드에서 1 ~ 2 개의 매개 변수가 필요하지 않습니다.

사용하기 전에 객체를 구성하려면 간단한 생성자로 구성하고 다른 세터를 호출하는 것보다 구축됩니다. 이것은 많은 인수를 가진 생성자를 호출하는 것과 비교하여 코드를 훨씬 더 읽기 쉽게 만듭니다 (세터 이름을 볼 수 있기 때문). 또한 새로운 속성이 나중에 오면 기존 공장 메소드를 수정하지 않고도 객체에 추가 할 수 있습니다.

예, OOP의 오버로드는 Java에서 기본 매개 변수를 사용하는 유일한 방법입니다. 하지만 여기에 해킹이 있습니다. 오버로드를 사용하고 기본 매개 변수가있는 경우 그러면 당신은 끝날 것입니다

public void methodA(A arg1) { }
public void methodA( B arg2,) { }
public void methodA(C arg3) { }
public void methodA(A arg1, B arg2) { }
public void methodA(A arg1, C arg3) { }
public void methodA( B arg2, C arg3) { }
public void methodA(A arg1, B arg2, C arg3) { }

그러나 varargs를 사용함으로써

public class DefaultValue
{
 public static void main(String[] args)
  {
       defaultParameter();
       defaultParameter(true);
  }

  public static void defaultParameter(Boolean …gender)
  {
       boolean genderBoolean = false; // It is the default value you want to give
       if(1 == gender.length)
       {
            genderBoolean = gender[0]; // Overrided Value
      }
       System.out.println(genderBoolean);
 }
}

위의 코드 출력이 있습니다

false
true

보다 단순한 예와 설명을 보려면 Java-Default-Parameter-Values

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