2017-11-06 1 views
0

파일 시스템에 읽기 및 쓰기를 수행하는 인터페이스가 있습니다. 내가 위의 코드는 Operations<User>뿐만 아니라 모두 Operations<List<User>> 작동한다자바 일반 유형이 T와 T의 목록을 허용하도록 허용

import java.io.IOException; 
import java.util.List; 

public interface Operations<T> { 

    void save(T serializableObject) throws IOException; 
    List<T> get() throws IOException; 

} 

이 인터페이스를 모두 목록에 음식뿐만 아니라 T.을 만드는 방법 이제 질문입니다. 내가 방법을 오버로드 한 경우

난 중복 된 코드를 당신은 varargs의 사용을 만들 수 T

void save(T serializableObject) throws IOException; 
void save(Collection<T> listOfTs); 
+2

번호 유형은 "a 또는 b"일 수 없습니다. 생각해 보면 왜 그런지 알게 될 것입니다. 어떤 유형인지 알 수 없습니다. 'List '을 시도해보고 호출자가 단일 항목에 대한 크기 목록을 작성하도록 요구할 수 있습니다. – Bohemian

+0

질문이 명확하지 않습니다. 목록 을 충족시키는 한 가지 방법과 T를 충족시키는 한 가지 방법이 있습니다. 더 정확히 원하는 것은 무엇입니까? 목록에있는 모든 T를 처리하고 각각에 대해 save (T ...) 메소드를 호출하는 기본 구현을 추가 할 수 있습니다 (목록 ...).) –

답변

3

추가 방법을해야 할 것입니다. 상기 방법은 다음과 같을 수있다 : obj.save(myArgument)

  • 여러 쉼표로 구분 인자 : obj.save(myFirstArgument, mySecondArgument)
  • 배열 : obj.save(new MyArgumentType[]{myFirstArgument, mySecondArgument})
  • 다음

    • 하나의 인자로 호출 될 수

      void save(T... objects) throws IOException; 
      

    +0

    Java 8을 사용한다면'Collection' 메소드에'default' 구현을 추가하십시오. – daniu

    +0

    나는 이미 내 마음 속에 이런 생각을 가지고있었습니다. 그러나 이것은 코드 중복을 생성합니다. 추가 된 구현 세부 사항으로 질문을 확인하십시오. – dataEnthusiast

    +0

    @dataEnthusiast 이유가 무엇인가요? 필자는 필자가 항상 콜렉션을 작성할 수 있다고 가정하고, 하나의 요소를 작성하는 것은 1 개의 요소를 수집하는 특별한 경우이다. 코드는 문제없이 여기에서 DRY 상태를 유지했습니다. – Antoniossss

    0

    의 수집을 받아 들일 것입니다

    @Override 
        public void saveCollection(List<T> serializableObjects) throws IOException { 
         String jsonData = objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(serializableObjects); 
         BufferedWriter br = new BufferedWriter(new FileWriter(file)); 
         br.write(jsonData); 
         br.close();  
        } 
    
        @Override 
        public void save(T serializableObject) throws IOException { 
         String jsonData = objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(serializableObject); 
         BufferedWriter br = new BufferedWriter(new FileWriter(file)); 
         br.write(jsonData); 
         br.close(); 
        } 
    
    1

    코드 중복이 염려되는 경우 단순히 공통 구현을 별도의 개인 메소드에 넣고 기존 오버로드를 사용하여 인수를 전달합니다.

    private void saveImpl(Object serializableObject) throws IOException { 
        String jsonData = objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(serializableObject); 
        BufferedWriter br = new BufferedWriter(new FileWriter(file)); 
        br.write(jsonData); 
        br.close(); 
    } 
    
    @Override 
    public void save(List<T> serializableObjects) throws IOException { 
        saveImpl(serializableObjects); 
    } 
    
    @Override 
    public void save(T serializableObject) throws IOException { 
        saveImpl(serializableObject); 
    } 
    
    관련 문제