2013-04-18 2 views
5

내가이 멤버 액세스 4 개 인스턴스 메소드가 같은인스턴스 변수를 인스턴스 메소드에 전달하는 대신 직접 액세스하는 방법?

String instanceMember; 

또한 인스턴스 부재 클래스가 상상. 이제 인스턴스 메서드에서 인스턴스 멤버에 직접 액세스하거나 각 인스턴스 메서드에 매개 변수로 인스턴스 멤버를 전달하기위한 실제 프로/죄수가 있는지 궁금합니다.

+0

기본적으로 "옳은 느낌" 가끔은 참조를 전달하는 것이 좋습니다. 일종의 "문서"로 작업하는 것입니다. (그러나 두려워하면 다시 돌아가서 parm passing scheme을 변경하는 것이 잘못되었다고 생각합니다. 많은 잔학 행위는 피할 수없는 (사소한) 변경의 이름으로 행해집니다.) –

답변

0

이러한 메서드가 퍼시 스턴트 멤버 변수의 상태를 조작하는 공용 메서드 인 경우 실제로 전달하지 않아야합니다.

myObject.SomeMethod(myObject.instanceMember, 15); 

이것은 정말 그냥해야한다 :

myObject.SomeMethod(15); 

이 있다면 당신은 다음과 같은 작업을 수행해야하는 경우 예를 들어, 아마도 대신에 전달되는 방법에 의해 직접 조작해야 (예를 들어, 위의 방법에서 신비한 15과 같이) 호출 당 변경 될 수있는 항목이 있으면이를 전달해야합니다.

6

값을 매개 변수로 전달하면 캡슐화 된 값이 아닌 매개 변수 값을 사용하여 계산을 수행하게됩니다.

캡슐화 된 데이터를 조작하려는 경우 매개 변수로 사용할 이유가 없습니다. 당신의 예를 방법은 "무료"에 액세스하기 위해 도착, 그들은 방법의 범위에 이미 있기 때문에 :

1

처음에 예를 변수를 가진 이유는 매개 변수로 전달되지 않도록하는 것입니다. 당신이 명시 적으로 통과, 또는에 객체를 전달해야하므로, 인스턴스 변수에 액세스 할 수 없습니다 클래스 메소드 -

  • 방법은 static입니다 :

    하지만 방법에 인스턴스 변수를 전달하는 두 가지 이유가 있습니다 어느 쪽을 조작 할까

  • 패스 바이 시맨틱를 사용할 필요가 있습니다. 즉, 건네받은 값을 변경하고 싶은 경우, 로컬 변수의 작성을 피하고 싶습니다. 이 방법이 재귀 인 경우가 종종 있습니다.

당신 자신이 당신의 방법 private static 만들 수있는 좋은 생각, 그리고 재귀를 시작하는 public 인스턴스 메소드를 추가 할 수 있습니다 많은 경우에 인스턴스 변수로 시작했다 매개 변수를 수정하는 재귀 코드를 작성 찾아내는 경우 사슬을 만들고 결과를 수확해야합니다.

+1

두 번째 경우에는 기술적으로 인스턴스 변수를 전달하지 않습니다 . –

+0

@HotLicks 좋은 지적, 감사합니다! 두 번째 경우에 무엇을해야하는지 자세히 설명하기 위해 아래쪽에 토론을 추가했습니다. – dasblinkenlight

+0

"값어치 의미 론적 의미"가 객체에 대해 이야기 할 때 혼란스러워한다고 생각합니다. 메서드에 객체 참조를 전달하면 메소드가 인스턴스 var를 참조하게되므로 객체 수정시 전역 효과가 발생한다는 사실을 변경하지 않아도됩니다. 이 지역은 초보자가 때때로 혼란스러워하는 곳입니다. –

0

사용 방법에 따라 크게 달라질 수 있습니다. 당신 클래스의 사용법이 드문 경우, 명백한 차이는 없을 것입니다.

클래스 인스턴스를 많이 사용하고 많은 스레드가 사용하는 경우 일부 조건에서는 매개 변수로 전달하면 조금 더 빠르게 작동합니다.

보통 인스턴스 멤버는 (명백한 이유로) 정적 함수를 제외하고 클래스 멤버가 직접 액세스합니다.

코딩 규칙을 따르므로 걱정하지 마십시오. 그때가되면 정말로 마음에 드는 답변을 알게 될 것입니다.

관련 문제