본문 바로가기
Flutter/Flutter FAQ

Flutter 팩토리 생성자 식별자의 장점을 살펴보세요., dart advantage of a factory constructor identifier

by 베타코드 2023. 9. 28.
반응형

질문


Flutter 앱을 위해 JSON 파싱을 조사하고 일반 생성자 대비 팩토리 생성자에 대한 질문이 있습니다. 팩토리 생성자를 사용하는 장점을 이해하려고 노력하고 있습니다. 예를 들어, 다음과 같이 JSON 생성자가 있는 모델 클래스를 생성하는 JSON 파싱 예제를 많이 볼 수 있습니다:

class Student{
  String studentId;
  String studentName;
  int studentScores;

  Student({
    this.studentId,
    this.studentName,
    this.studentScores
  });

  factory Student.fromJson(Map<String, dynamic> parsedJson){
    return Student(
      studentId: parsedJson['id'],
      studentName : parsedJson['name'],
      studentScores : parsedJson ['score']
    );
  }
}

또한 팩토리로 선언되지 않은 예제도 동등한 수로 볼 수 있습니다. classname.fromJSON 생성자 모두 JSON 데이터에서 객체를 생성하므로 생성자를 팩토리로 선언하는 것이 장점이 있을까요? 아니면 여기서 팩토리를 사용하는 것은 불필요한 것인가요?


답변


일반 생성자는 현재 클래스의 새 인스턴스를 항상 반환합니다 (예외가 발생하지 않는 한).

팩토리 생성자는 정적 메소드와 매우 유사하지만 다음과 같은 차이점이 있습니다

  • 현재 클래스 또는 하위 클래스의 인스턴스만 반환할 수 있습니다.
  • new로 호출할 수 있지만, 이제는 덜 중요한 요소입니다.
  • 초기화자 목록이 없습니다 (: super() 없음)

따라서 팩토리 생성자는 다음과 같은 용도로 사용될 수 있습니다

  • 하위 클래스의 인스턴스를 생성하는 데 사용될 수 있습니다 (예: 전달된 매개변수에 따라 다름)
  • 새 인스턴스 대신 캐시된 인스턴스를 반환하는 데 사용될 수 있습니다
  • 계산된 값을 준비하여 일반 생성자에 전달하여 최종 필드를 초기화하는 데 사용될 수 있습니다. 이는 일반 생성자의 초기화자 목록에서 수행할 수 있는 작업의 제한을 우회하는 데 자주 사용됩니다 (예: 오류 처리).

예를 들어, 다음 코드는

  studentId: parsedJson['id'],
  studentName : parsedJson['name'],
  studentScores : parsedJson ['score']

final 필드를 초기화할 필요가 없으므로 일반 생성자의 본문으로 이동할 수 있습니다.

반응형

댓글