객체 지향 디자인 패러다임 내에서 객체 외부의 객체를 수정해서는 안됩니다. 객체 상태에 대한 모든 변경은 객체의 메소드를 통해 수행 해야 합니다.
따라서 void predictPrice(Item item)
다른 클래스의 멤버 함수로는 잘못되었습니다 . C 시대에는 받아 들여질 수 있었지만 Java 및 C ++의 경우 객체를 수정하면 객체와 더 긴밀하게 연결되어 다른 설계 문제가 발생할 수 있습니다 (클래스를 리팩터링하고 필드를 변경할 때, 이제 다른 파일에서 'predictPrice'를 변경해야합니다.
새 객체를 반환하고 관련 부작용이없는 경우 전달 된 매개 변수는 변경되지 않습니다. 귀하 (predictPrice 방법)는 해당 매개 변수가 사용되는 곳을 모릅니다. 가 Item
해시 곳의 열쇠는? 이 작업에서 해시 코드를 변경 했습니까? 다른 사람이 변하지 않기를 기대하고 있습니까?
이 디자인 문제는 객체를 수정해서는 안된다는 것을 강력하게 암시하는 것입니다 (많은 경우 불변성을 주장합니다). 그렇다면 상태 변경 사항이 객체가 아닌 객체 자체에 의해 포함되고 제어되어야합니다 수업 이외의 다른.
해시에서 무언가의 필드를 피들 링하면 어떻게되는지 봅시다. 코드를 보자.
import java.util.*;
public class Main {
public static void main (String[] args) {
Set set = new HashSet();
Data d = new Data(1,"foo");
set.add(d);
set.add(new Data(2,"bar"));
System.out.println(set.contains(d));
d.field1 = 2;
System.out.println(set.contains(d));
}
public static class Data {
int field1;
String field2;
Data(int f1, String f2) {
field1 = f1;
field2 = f2;
}
public int hashCode() {
return field2.hashCode() + field1;
}
public boolean equals(Object o) {
if(!(o instanceof Data)) return false;
Data od = (Data)o;
return od.field1 == this.field1 && od.field2.equals(this.field2);
}
}
}
이데온
그리고 이것이 가장 큰 코드는 아니지만 (직접 필드에 액세스), 가변 데이터가 HashMap의 키로 사용 되거나이 경우에는 해시 세트.
이 코드의 출력은 다음과 같습니다.
true
false
일어난 일은 해시 코드가 삽입되었을 때 사용 된 객체가 해시에있는 곳입니다. hashCode를 계산하는 데 사용되는 값을 변경해도 해시 자체는 다시 계산되지 않습니다. 이 퍼팅의 위험이 있습니다 어떤 해시에 열쇠로 변경 가능한 객체를.
따라서 질문의 원래 측면으로 돌아가서 호출되는 메소드는 매개 변수로 가져 오는 오브젝트가 어떻게 사용되고 있는지 "알지"않습니다. 이를 수행 할 수있는 유일한 방법으로 "객체를 변형시키다"를 제공한다는 것은 크롤링 할 수있는 여러 가지 미묘한 버그가 있음을 의미합니다. 해시에서 값을 잃는 것처럼 ... , 그건 나쁜 버그입니다 (해시 맵에 20 개의 항목을 더 추가 한 다음 갑자기 다시 나타날 때까지 값을 잃었습니다).
- 가없는 아주 새로운 객체가 할 수있는 가장 안전한 일이 반환 객체를 변경하는 이유는.
- 객체를 수정해야 할 적절한 이유 가 있을 경우 필드를 뒤틀 수있는 외부 함수가 아닌 객체 자체 (메서드 호출)를 통해 수정해야합니다.
- 이를 통해 유지 관리 비용을 낮추면서 객체를 리팩터링 할 수 있습니다.
- 이 객체는 해시 코드를 계산 값이 있는지 확인 할 수 있습니다 하지 않는 변화를 (또는 해시 계산의 일부가 아닌)
관련 : if 문의 조건문으로 사용 된 인수의 값을 겹쳐 쓰고 리턴하는 경우 동일한 if 문 내부