2014-06-11 7 views
0

현재 나의 과제에서는 테스트 케이스를위한 재귀 Field 객체 (두 가지 맞춤 클래스)로 채워진 새로운 SchemaArtifact 객체를 빌드해야합니다. 유창한 인터페이스를 사용하여이 작업을 수행해야합니다. 문제는 내 build() 함수 (트리에서 한 레벨 위로 팝업)는 호출 필드가 최상위 레벨에 있으면 루트 SchemaArtifact를 반환하거나 자식 필드 인 경우 부모를 반환해야한다는 것입니다.Java - Generics를 사용하여 유창한 인터페이스 만들기

public class SchemaHelper{ 
    public SchemaArtifact makeSchema(){ 
     return new SchemaArtifact() 
      .addField(new Field("FirstName")) 
       .addField(new Field("Nickname")).build() 
       .build() 
      .addField(new Field("LastName")).build(); 
    } 
} 

public class SchemaArtifact{ 
    private Map<String, Field> fields = new Map(); 

    public addField(Field f){ 
     this.fields.put(field.id, f); 
     return f; 
    } 
} 

public class Field{ 
    public String id; 
    private Map<String, Field> fields = new Map(); //children 
    private Field parent; //null if parent is just the main schema 
    private SchemaArtifact schema; //schema that this Field belongs to 

    public Field(String id){ 
     this.id = id; 
    } 

    public Field addField(Field f){ 
     this.fields.put(field.id, f); 
     return f; 
    } 

    public <T> T build(){ 
     if(this.parent != null){ 
      return (T)this.parent; 
     }else{ 
      return (T)this.schema; 
     } 
    } 
} 

당신은 내가 여러 유형을 반환하는 제네릭을 사용하여 시도, 볼 수 있듯이,하지만 난 방법 addField (필드) 정의되지 않은 "얻을 :이 혼란 들릴지 알고, 그래서 잘하면 몇 가지 예제 코드는 그것을 지울 수 있습니다 한 번에 둘 이상의 필드를 추가하려고 할 때 Object 유형에 대해. 나중에 불필요한 캐스팅이 필요했던 래퍼 인터페이스를 사용해 보았습니다. 별도의 buildToSchema()/buildToField() 메소드를 사용하면 효과적이지만 라인 아래로 여러 스키마를 생성하는 것이 혼란 스럽습니다.

내가 말했듯이, SchemaArtifact와 Field를 모두 반환하는 단수의 build() 메소드를 얻는 방법이 있습니까?

, 감사합니다
타일러

+1

1) 반환 형식이'# addField'에 없습니다. 2) 'T'는 무엇인가? 3)'parent'와'schema'는'Field'에 선언되어 있지 않습니다. – qqilihq

+0

고정 1 및 3 RE # 2 : 답변 [여기]와 같은 것을 구현하려고했습니다 (http://stackoverflow.com/questions/3552537/java-one-function-with-many-return-types -is-it-possible-with-generics), 그러나 나는 아마 그것을 어떻게 든 망쳐 놓을 것이다. 나는 T를 사용하여'build()'가 Object를 리턴한다는 것을 의미한다고 믿는다. 그래서 그 뒤에'addField()'를 사용할 때 오류가 발생한다. –

답변

1

build()의 반환 형식이 컴파일시에 알려 져야한다. 이 경우 반환되는 객체의 클래스는 런타임 조건에 따라 달라 지므로 컴파일 타임에 알 수 없습니다.

두 가지 가능성이하십시오 Field 또는 SchemaArtifact을 기대하는 경우

  • 당신은 알고있다. 이 경우에는 두 개의 분리 메소드를 사용하고 적절할 경우 사용해야합니다.
  • 예상되는 유형을 알 수 없습니다. 이 경우 인터페이스를 사용해야합니다.

당신이도 수 :

Field field = new SchemaArtifact() 
     .addField(new Field("FirstName")) 
      .addField(new Field("Nickname")).build(); 
SchemaArtifactschema = field.build(); 

이 올바른 유형을 추론하는 컴파일러를 강제하지만,이 두 가지 방법을 사용하는 것과 동일합니다, 안전 단지 적은 종류의 (a ClassCastException가있을 것입니다 잘못된 유형을 사용하는 경우).

+0

답변 해 주셔서 감사합니다. 나는 둘을 연결하기 위해'IFluentSchema' 인터페이스를 만들었고 그래서 한가지 타입으로 어느 타입을 반환 할 수있었습니다. –