2014-10-05 3 views
1

개체의 속성을지도 항목의 키로 사용하는 것은 나쁜 습관입니까? 내가 할 때마다, 그것은 틀린 느낌입니다. 예를 들어Java Map : 값 객체의 속성을 키로 사용합니까?

: 그것은 종류의 잘못된 느낌

Foo foo = new Foo(); 
foo.name = "foo bar"; 
foo.bar = "blaaaa"; 

Map<String, Foo> foos = new HashMap<>(); 
foos.add(foo.name, foo); 

:

class Foo { 
    String name; 
    String bar; 
} 

그리고이 같은지도를 사용합니다.

+0

이것은 'Map' - 인덱스 검색의 가장 일반적인 용도 중 하나입니다. 여기에는 문제가 없습니다. 'Foo'가 변경 가능하다면'Foo'가 바뀌면 색인이 잘못 될 것입니다. –

+0

우려되는 사항이 메모리 낭비라면,'String' 키의 특별한 경우에 풀을 이용할 수 있습니다 ('String.intern' 문서 참조). – Dici

+0

경우에 따라 클래스 대신 열거 형을 사용하여 동일한 사용 사례를 달성 할 수 있지만 더 좋거나 불변 인 경우가 있습니다. 그렇다면 예를 들어 뭔가가 HashMap 대신에 HashSet에 있는지 검사 할 수 있습니다.이 HashMap은 특정 관심사를 제거합니다 (그러나 걱정할 필요는 없습니다). –

답변

1

언뜻보기에는 틀린 것 같습니다.

필드를 과 같이 사용하는 것은 합리적입니다. 조금 중복되지만 합법적 일 수 있습니다. 키의 값의 출처는 중요하지 않습니다! Map의 목적은 요소를 검색하기 때문입니다. 그리고 그런 일을하는 것이 공정한 일입니다.

유죄라고 생각하면 부작용이없는 경우 클래스에서 필드를 제거 할 수 있습니다.

필드에 메서드를 사용하지 않는 것은 무엇이 잘못되었을 수 있습니다. 다음과 같은 scenerio를 고려하십시오. 두 개의 문자열을 새로운 키로 결합하고자합니다. 수천 번 필드를 참조한 경우 행운이 없습니다! 필드의 모든 항목을 대체하면됩니다. 실수로 다른 것을 대체하면 버그와 불편을 겪을 수 있습니다.

하지만 방법이 있다면 메소드의 부품을 변경하기 만하면됩니다.

+0

두 개의 마지막 단락은 분명하지 않습니다 (나에게). – Dici

+0

저는 항상 메소드를 사용합니다. 빠른 예제를 위해 필드를 사용했습니다. 어쨌든 고마워! :) –

관련 문제