Getter를 통해 직접 개인 목록에 추가 할 수 있습니까?

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

  •  23-08-2019
  •  | 
  •  

문제

나는 단순히 테스트를 직접 작성하는 것이 아니라 화염을 느끼게 될 것임을 알고 있습니다. 그러나 나는 기능뿐만 아니라 사람들의 의견에 대해 궁금합니다.

개인 목록이있는 수업이 있습니다. 대중 GetMylist () 메소드를 통해 해당 개인 목록에 추가하고 싶습니다.

그래서 ...이게 작동할까요?

public class ObA{
 private List<String> foo;
public List<String> getFoo(){return foo;}
}

public class ObB{
   public void dealWithObAFoo(ObA obA){
     obA.getFoo().add("hello");

   }
}
도움이 되었습니까?

해결책

그렇습니다. 그것은 절대적으로 효과가있을 것입니다 - 그것은 보통 나쁜 것입니다. (이것은 당신이 정말로 돌아 오기 때문입니다 참조 컬렉션 자체의 사본이 아닌 컬렉션 개체에.)

종종 컬렉션에 진정으로 읽기 전용 액세스를 제공하려고합니다. 이는 일반적으로 컬렉션 주변의 읽기 전용 래퍼를 반환하는 것을 의미합니다. 컬렉션에서 구현하고 실제 컬렉션 참조를 반환하는 읽기 전용 인터페이스를 반환하기 위해 반환 유형을 만드는 것은 많은 보호를 제공하지 않습니다. 발신자는 "실제"수집 유형으로 쉽게 캐스트 한 다음 아무런 문제없이 추가 할 수 있습니다.

다른 팁

실제로, 좋은 생각은 아닙니다. 부적절한 멤버를 외부에 게시하지 마십시오. 즉, 읽기 전용 버전을 즉시 제공 할 수 없다면 사본을 만드십시오 ...

public class ObA{
  private List<String> foo;
  public List<String> getFoo(){return Collections.unmodifiableList(foo);}
  public void addString(String value) { foo.add(value); }
}

이 작업에 대한 의견을 원한다면 getFoo() 전화를 걸고 추가하십시오 add(String msg) 그리고 remove(String msg) OBA에 대한 방법 (또는 다른 기능을 노출하려는 다른 기능)

컬렉션에 접근하는 것은 항상 내 경험에서 항상 나쁜 일인 것 같습니다. 대부분의 사람들이 나면 통제하기가 거의 불가능하기 때문입니다. 나는 수업이 포함 된 수업 밖에서 컬렉션에 직접 접근 할 수없는 습관을 가졌다.

이것의 주된 추론은 거의 항상 데이터 모음에 첨부 된 비즈니스 로직이 있다는 것입니다. 예를 들어, 추가에 대한 검증 또는 두 번째 밀접한 관련 컬렉션을 추가 해야하는 날에 필요한 경우.

당신이 말하는 것처럼 액세스를 허용한다면, 앞으로 이와 같은 수정을하는 것은 매우 어려울 것입니다.

오, 또한, 나는 종종 저장하는 객체와 함께 조금 더 많은 데이터를 저장해야한다는 것을 알게됩니다. 그래서 새 객체 (컬렉션이있는 "컨테이너"내부에만 알려져 있음)를 만듭니다. 컬렉션에 넣기 전에 그 안에.

당신이 당신의 컬렉션을 잠긴 상태로 유지했다면, 이것은 사소한 리팩터입니다. 어떤 경우에는 컬렉션을 잠그지 않은 곳에서 작업 한 경우가 얼마나 어려울 지 상상해보십시오 ...

FOO에 기능을 추가하고 제거하려면 AddFoo () 및 removeFoo () 메소드를 제안합니다. 이상적으로는 필요한 각 기능에 대한 메소드를 만들어 GetFoo를 함께 제거 할 수 있습니다. 이로 인해 발신자가 목록에서 미리 형성 될 함수에 대해 명확하게 만듭니다.

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