문제

나는 최근에 일부 Java를 읽고 나에게 새로운 무언가 (관용구?)를 발견했습니다. 프로그램에서 여러 생성자가있는 수업에는 항상 빈 생성자가 포함됩니다. 예를 들어:

public class Genotype {
  private boolean bits[];
  private int rating;
  private int length;
  private Random random;

  public Genotype() {              //  <= THIS is the bandit, this one right here
    random = new Random();
  }

  /* creates a Random genetoype */
  public Genotype(int length, Random r) {
    random = r;
    this.length = length;
    bits = new boolean[length];

    for(int i=0;i<length;i++) {
        bits[i] =random.nextBoolean();
    }
  }

  /* copy constructor */
  public Genotype(Genotype g,Random r) {
    random = r;
    bits = new boolean[g.length];
    rating = g.rating;
    length = g.length;

    for(int i=0;i<length;i++) {
        bits[i] = g.bits[i];
    }

  }
}

첫 번째 생성자는 "실제"생성자가 아닌 것처럼 보이며, 모든 경우 다른 생성자 중 하나가 사용되는 것처럼 보입니다. 그렇다면 왜 그 생성자가 전혀 정의됩니까?

도움이 되었습니까?

해결책

나는 당신이 읽고 있던 코드가 고품질인지 확신하지 못합니다 (과거에는 일부 생물 정보학 코드를 검토했으며 불행히도 전문 개발자가 작성하지 않습니다). 예를 들어, 세 번째 생성자는 사본 생성자가 아니며 일반적 으로이 코드에 문제가 있으므로 "너무 많이 읽지 않습니다".

첫 번째 생성자는 기본 생성자입니다. 최소값 만 초기화하고 사용자는 나머지를 게터와 세터로 설정할 수 있습니다. 다른 생성자는 종종 호출이 적은 물체를 만드는 데 도움이되는 "편의 생성자"입니다. 그러나 이것은 종종 생성자 사이의 불일치로 이어질 수 있습니다. 실제로, 최근에 세터를 호출하는 기본 생성자가 바람직하다는 것을 보여주는 최근의 연구가 있습니다.

기본 생성자가 중요한 경우도 있습니다. 예를 들어, XML에서 직접 개체를 생성하는 데 사용되는 Digester와 같은 특정 프레임 워크는 기본 생성자를 사용합니다. 일반적으로 Javabeans는 기본 생성자를 사용합니다.

또한 일부 수업은 다른 클래스에서 상속됩니다. 부모 객체의 초기화가 "충분히 양호"인 경우 기본 생성자가 표시 될 수 있습니다.

이 특정한 경우, 해당 생성자가 정의되지 않은 경우 모든 세부 사항을 미리 알아야합니다. 항상 바람직하지는 않습니다.

마지막으로 일부 IDE는 기본 생성자를 자동으로 생성하므로 클래스를 쓴 사람은 클래스를 제거하는 것을 두려워 할 수 있습니다.

다른 팁

대상입니다 직렬화 가능?

비 서리화 할 수없는 클래스의 하위 유형을 직렬화 할 수 있도록 하위 유형은 SuperType의 공개, 보호 및 (접근 가능한 경우) 패키지 필드의 상태를 저장 및 복원 할 책임이 있다고 가정 할 수 있습니다. 하위 유형은 연장되는 클래스에 클래스의 상태를 초기화하기위한 액세스 할 수없는 No-Arg 생성자가있는 경우에만이 책임을 가정 할 수 있습니다. 그렇지 않은 경우 클래스 직렬화 가능한 클래스를 선언하는 것은 오류입니다. 런타임에 오류가 감지됩니다.

사제화하는 동안, 비 서리화할 수없는 클래스의 분야는 클래스의 대중 또는 보호되지 않은 비 ARG 생성자를 사용하여 초기화됩니다. ARG 생성자는 직렬화 가능한 서브 클래스에 액세스 할 수 있어야합니다. 직렬화 가능한 서브 클래스의 필드는 스트림에서 복원됩니다.

그렇습니다. 나는 빈 생성자가 충분한 경우가 있지만 "공백"생성자가 항상 존재해서는 안된다는 데 동의합니다 (초보자는 종종이 실수를 저지른다). 그러나 빈 생성자가 불변을 위반하는 경우 건설 후 모든 회원이 제대로 인스턴스화됩니다, 빈 생성자를 사용해서는 안됩니다. 생성자가 복잡한 경우 구성을 여러 보호/개인 방법으로 나누는 것이 좋습니다. 그런 다음 a 공전 방법 또는 다른 방법 공장 필요에 따라 보호 된 건축 방법을 호출하는 클래스.

위에서 쓴 것은 이상적인 시나리오입니다. 그러나 Spring과 같은 프레임 워크는 코드에서 생성자 로직을 제거하고 일부 XML 구성 파일로 제거합니다. Getter 및 Setter 기능이있을 수 있지만 인터페이스에서 피할 수 있습니다. 여기에 설명 된대로.

기본 생성자는 필수가 아닙니다.

클래스에 정의 된 생성자가 없으면 기본값 (빈) 생성자가 자동으로 생성됩니다. 매개 변수화 된 생성자를 제공 한 경우 기본 생성자가 자동으로 생성되지 않으며 직접 작성하는 것이 좋습니다. 런타임시 의존성 주입 및 동적 프록시 생성을 사용하는 프레임 워크에는 일반적으로 기본 생성자가 필요합니다. 따라서, 그것은 당신이 쓰는 클래스의 사용 사례에 달려 있습니다.

기본 생성자는 기능적보기에 적합하지 않습니다. 객체에 메소드에 대한 전역 가시성이있는 경우 기본 생성자가 사용됩니다. 예를 들어, 시도/캐치에 객체의 실제 상태를 기록 할 수 있습니다.

MyObejct myObject=null
try{...
}catch(Exception e){
    log.error(myObject);//maybe print null. information?
}

아니면 선호합니까?

MyObejct myObject=new Object();
try{...
}catch(Exception e){
log.error(myObject);//sure print  myobject.toString, never null. More information
}

?

다른 길은 빈 객체를 만드는 것은 많은 논리가 없지만, 널 객체는 내 생각에 유해합니다. 당신은 읽을 수있다 이 게시물

그것은 사본 생성자가 아닙니다. 기본적으로 일부 프레임 워크로 작업 할 때 빈 생성자를 원합니다. 물론 공개 또는 개인이 항상 빈 생성자가 있어야하지만 적어도 클래스가 어떻게 인스턴스화되는지를 제어 할 수 있습니다.

나는 보통 객체를 완전히 초기화하는 하나의 생성자를 씁니다. 다른 사람이 있다면, 그들은 모두 적절한 기본값으로 이것 (...)이라고 부릅니다.

객체는 100% 초기화되고 생성 될 때 사용할 준비가되어 있어야합니다.

예를 들어 최대 절전 모드와 같은 일부 프레임 워크는 무기 생성자를 요구합니다. 그들이 모범 사례와 충돌하는 방식은 때때로 나를 불안하게 만듭니다.

기본 및 비어있는 (빈) 생성자가 있으면 최종 필드가 있지 않습니다. 이것은 종종 필요하지 않은 곳에서 많은 돌연변이를 초래합니다.

빌더 패턴을 사용하면이 두 가지 스타일을 혼합하고 공장 뒤에 많은 구조 생성자를 숨겨서 불변성을 유지하면서도 유연한 초기화를 허용 할 수 있습니다.

일부 POJO 클래스 또는 간단한 클래스의 경우 기본 생성자는 때때로 클래스를 사용하여 단위 테스트를 원하는 경우 유용합니다. 당신은 그들을 조롱 할 필요가 없으며, 기본 생성자가있는 객체를 새롭게 만들고 값 세트를 테스트하고 그들로부터 가져 오거나 인수로 전달할 수 있습니다.

이 클래스를 연장 한 클래스에 대한 빈 생성자를 만들고자합니다. 수업을 연장 했으므로 이제 아이는 상기 수업을 참조하는 슈퍼가 있습니다. 어린이가 슈퍼 (물건)를 지정하지 않은 경우 ... 다른 생성자를 참조하기 위해 내부의 물건은 이제 빈 생성자를 참조하려고 시도합니다.

나는 오류가 무엇인지 잘 모르겠다. 나는 지금 나의 첫 번째 부모 객체 관계를 코딩하고 있으며 여기에서 물건을 찾고 있었다.

나는 당신이 비어있는 비어있는 비어있는 생성자를 만드는 순간을 추가해야한다고 생각합니다. 물론 Default Super ()를 제거하는 것을 지정하여 Super를 관리하기 위해 확장 클래스를 만들었다면, 당신은 이것을 회피하지만 누군가가 당신의 클래스를 사용하고 그것을 확장하고 그것을 확장하고 그것을 깨닫지 못했다면? t 방금 만들 수 있었을 때 빈 세트.

이것은 나의 첫 번째 게시물이지만 내가 그것을 이해하는 방식에서 균열을 취하고 싶었습니다.

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