[미친 자바] 객체 대상: 불변 클래스
1860 단어 미친 Java 노트미친 자바대상을 향하다불변류
1) 주의!보증하는 것은 값이 변할 수 없다는 것이다. 무엇이 값입니까?하나의 인용에 대해 말하자면 바로 지침이다. 즉, 지침의 값은 변하지 않는다. 즉, 그 지향은 변하지 않는다. 그러나 나는 이 지침을 통해 대상 구성원을 바꿀 수 있는 방법을 호출할 수 있다!!
2) 즉final 인용 변수를 수식하면 이 인용의 지향이 변하지 않을 수 있지만 이 인용이 지향하는 대상이 변하지 않을 수 없고 그 지향하는 대상은 변할 수 있다!!
3) 예: final Person p = new Person("Tom"). p.setName("Peter");허락했어!!
2. 불변 클래스:
1) 불변 클래스는 해당 클래스를 작성한 후 이러한 객체의 데이터 구성원이 변경될 수 없음을 의미합니다.
2) 이러한 수요는 보편적이다. 예를 들어 자바의 8개의 패키지 유형과String류는 모두 변할 수 없는 종류이다.
3) 자신의 불가변류를 어떻게 설계해야 하는가?3원칙:
i. 데이터 구성원은 모두private final입니다!이것은 명백하다.
ii. Getter만 제공, setter는 제공되지 않습니다!이것도 명백하다.
iii.hashCode와 equals는 데이터 구성원에 따라 계산할 수 있고hashCode가 같은 상황에서도 equals가 같은 것을 보장해야 한다.
4) 상기 세 가지 원칙이 있으면 디자인의 유형이 변할 수 없다는 것을 기본적으로 보장할 수 있다.
!!기본은 무엇입니까?설마 이렇게 해서도 변할 수 없는 종류라는 것을 보장할 수 없단 말인가?
!!물론 데이터 구성원이 모두 Integer,String 등 자체가 변할 수 없는 클래스라면 당연히 문제가 없다. 그러나 업무상 당신이 포함하고 싶은 데이터 구성원은 모두 다른 회사가 개발한 클래스 라이브러리의 클래스이고 많은 클래스 자체가 변할 수 있는 클래스이다. 그러나 당신은 이러한 클래스 라이브러리의 원본을 얻지 못하기 때문에 원본을 바꾸는 방식으로 이런 클래스를 변할 수 없는 클래스로 바꿀 수 없다.
5) 따라서 현재의 문제는 가변 클래스의 대상을 포함하는 클래스를 불가변 클래스로 설계하려면 어떻게 해야 하는가?
사실 사고방식은 매우 간단하다!단지 두 가지 측면에서 출발할 뿐이다.
a. 클래스 내부에서 이 가변 구성원에 대한 모든 방문은 수정할 수 없다는 것을 보증해야 한다.이것은 명백히 알 수 있는 것이다!말하지 않아도 다 생각할 수 있을 거야.
b. 또한 수정 위험이 발생할 수 있는 부분은 이 가변 구성원으로 돌아가는 것이다. 만약에 한 방법이 마침 이 가변 구성원으로 돌아간다면 귀환 후 클래스의 외부에서 이 구성원에 대해 완전히 수정할 수 있다(즉 데이터 구성원으로 돌아가는 것도 클래스의 내부 상황을 폭로하는 일종의 상황).
ii. 그래서 문장을 해야 할 부분은 b.에 있다.
iii. 사실 대응 전략도 간단합니다. 이 구성원의 던전을 만들고 돌아오면 됩니다. 그러면 외부에서 받은 것은 이 구성원의 던전일 뿐이고 던전의 수정은 원본에 영향을 주지 않습니다.
6) 예:
class Test {
private final StringBuilder name; // StringBuilder,
public Test(StringBuilder name) {
this.name = name;
}
public StringBuilder getName() {
return new StringBuilder(name); // ,
}
}