2012-03-07 5 views
1

지난 주 인터뷰에서 프로그래밍 테스트의 질문 중 하나는 "클래스의 다른 생성자가 Java에서 동일한 동작을 수행하도록하려면 어떻게 할 수 있습니까?"입니다. 나는 아니었고 여전히 "같은 행동을"한다는 것을 확신하지 못했습니다. I 준 대답 하였다 : 여기다른 생성자가 Java에서 동일한 동작을 수행하는지 확인

 

    (new MyObject(...)).equals(new MyObject(...)); 
    (new MyObject(...)).hashCode == (new MyObject(...)).hashCode(); 

는, 각 라인에서, 제 MyObject를 (...)를 하나의 생성자와 다른 제를 말한다.

질문에 대해 실제로 묻고있는 부분이 무엇이라고 생각하십니까?

답변

4

나는 당신의 대답을 정확하다고 생각하지 않을 것입니다. 두 객체가 동일하다는 것을 증명할뿐입니다 (객체가 같으면 BTW, 이 같아야합니다. hashCode(), 두 번째 비교는 중복 됨).

올바른 해결책은 기본 생성자를 가지고 있으며 다른 모든 생성자를 this(...)을 호출하여 위임하는 것입니다. 모든 기본이 아닌 생성자가 가능한 짧으면, 모두 동일한 코드에 위임하므로 모두 동일한 방식으로 작동합니다.

그리고 물론 : 단위 테스트가 정답 일 수도 있습니다.

+0

+1, 나는이 똑같은 대답을 타이핑했다. :) – casablanca

+0

답장을 보내 주셔서 감사합니다. 하지만 정확히 말하면 "같은 방식으로 행동하는"것은 무엇을 의미합니까? – Alex

+0

@Alex : 면접관이 "* 같은 행동을 *하고있다"는 의미는 무엇입니까? 내 의견으로는 짐작할 수 있습니다. * 동일한 일관성있는 동작을합니다. 모든 생성자가 동일한 생성자에 위임 할 때 입증 될 수 있습니다. –

0

그것은 당신이 같고 예를 들어 해시 코드

정의하는 방법에 따라 달라집니다 (최악 하나를!)는 아무튼 지금 equals()

return true; 

의 다음 구현과 hashcode()

return 1; 

을 고려 사물의 상태가 무엇이든 상관 없습니다!

+0

네, 맞습니다. 나는 내 대답을 썼을 때 그것을 깨달았지만, "같은 방식으로 행동하는"것이 의미하는 것이 무엇인지 알 수 없었다. 그래도 그것을 지적 주셔서 감사합니다. – Alex

1

나는 this()super()의 사용과 관련이 있다고 생각합니다.

+0

답변 해 주셔서 감사합니다. 하지만이 시나리오에서 super()를 어떻게 사용 하시겠습니까? – Alex

+0

여러개의 생성자를 가지고 있다면'this()'를 다른 인자로 호출 할 수 있습니다. 그러나 결국에는 그 중 하나에서만'super()'(암시 적 또는 명시 적으로) 호출하고 나머지는 "연결"해야합니다 – jambriz

0

참조하는 클래스가 주어진 메소드를 재정의하지 않으면 두 개의 다른 객체 (메모리 할당 세부 사항이 다름)이므로 여전히 등호가 false가됩니다. 해시 코드도 작동하지 않습니다.

리플렉션을 사용하여 클래스를 탐색하는 코드를 작성하고 각 필드가 동일한 값을 갖고 있는지 확인할 수 있다고 생각합니다. 결국, 두 인스턴스는 필드에 의해서만 다르며 컴파일 타임에 설정되기 때문에 메소드가 아닙니다.

다음 인터뷰에서 Goodluck.

+0

확실하게 하나는 그것을 사용하기 전에 equals()를 오버라이드했을 것입니다. – Alex

관련 문제