문제

get을 호출할 때마다 호출되는 메서드를 정의하는 방법이 있나요?

개체 연락처가 있는데 updateLastUsed()를 설정하고 싶지 않습니다.내 회원을 위한 약 30개의 Getter가 있습니다.

도움이 되었습니까?

해결책

나는 AOP를 제안했지만 J2ME라면 우리는 30 명의 액세서 각각에 "ongetCalled ()"를 수동으로 삽입 한 다음 해당 방법 내에서 필요한 모든 것을 코딩하는 것이 좋습니다. 미래에 필요한 경우 (또는 부동산에 액세스하는) 메소드의 이름으로 전달할 수 있습니다.

다른 팁

속성에 대한 getter에 액세스하는 대신 속성 이름을 입력으로 가져 오는 일반적인 getter를 만들 수 있습니다. 속성이 다른 유형 인 경우 리턴 유형은 객체 여야합니다.

이 일반적인 getter에서는 속성 getter와 updatelastused () 메소드를 호출합니다. 안전하기 위해 모든 부동산 getters를 비공개로 만드십시오.

모든 메소드에 대한 호출을 추가하거나(지루함) AOP 형식을 사용할 수 있습니다(예:AspectJ(아래 예))를 사용하여 유형의 getter를 일치시키고 updateLastUsed() 메서드를 호출합니다.

편집하다:몇몇 사람들은 30개의 게터가 코드 냄새이고 다른 메소드를 호출하는 것은 부작용이라고 지적했습니다.첫 번째 진술은 공정한 지표이지만 규칙은 아닙니다.이런 종류의 유형을 갖는 데에는 여러 가지 이유가 있을 수 있습니다. 추가 정보 없이 책임을 두 가지 이상의 유형으로 분리할 수 있는지 확인하기 위한 조언으로 남겨 두겠습니다.

부작용에 대한 다른 점은 관련이 있을 수도 있고 그렇지 않을 수도 있습니다.getter 메소드에 적용하는 것이 타당한 교차 절단 문제가 많이 있습니다.예를 들어 로깅, 인증, 캐싱이 있습니다.예제 메소드 updateLastUsed()는 캐싱 전략의 일부일 수 있으므로 제 생각에는 이 질문에 대한 무조건적인 비판은 옳지 않습니다.

AspectJ에서 포인트컷과 어드바이스를 구현하는 방법의 예는 다음과 같습니다.

package test;

public aspect TestAspect {
    /**
     * Match all getters of test.Contact and bind the target.
     */
    protected pointcut contactGetters(Contact contact) : 
        execution(* test.Contact.get*()) && target(contact);

    /**
     * Before execution of each getter, invoke the updateLastUsed() method
     * of the bound target.
     */
    before(Contact contact): contactGetters(contact) {
        contact.updateLastUsed();
    }       
}

이 작업을 수행하려면 AOP와 같은 것이 필요합니다. 나는 그것이 J2ME에 얼마나 잘지지되었는지 모르겠다. 이것.

AOP 외에도 사용할 수 있습니다 java.lang.reflect.Proxy, 또는 바이트 코드 조작 ...

그러나 J2ME에는 아닙니다

updatelastused ()를 30 번 호출하는 것이 좋습니다.

이것은 측면 지향 프로그래밍 (AOP)의 직업처럼 보입니다.

시작하는 모든 것에 대해 실행할 측면 정의 get*

"New"AspectJ 5 재료는 주석을 사용하여 측면 지점을 정의하여 포인트 컷을 호출하도록 getters에 주석을 달 수 있습니다. @Before 방법의 본체 실행.

정규 표현식을 사용하여 메소드 호출을 Getter 헤더에 추가하십시오.

찾다:

\w+ get\w+\s*\(\)\s*\{(\s*)

대체 : :

\0updateLastUsed();\1

이 표현식은 "찾기/교체"대화에서 "모두 교체"를 사용하여 Eclipse 3.5 (Galileo)를 사용하여 테스트되었습니다.

사용하는 편집기는 멀티 라인 매칭을 지원해야합니다 (또는 활성화해야합니다). Emeditor 8.05의 경우 검색 문자열을 다음과 같이 수정해야했습니다.

\w+ get\w+\s*\(\)\s*\{\s*(\n\s*)

새 라인이 명시 적으로 일치하도록합니다. 교체 문자열은 그대로 유지됩니다.

당신은 멋진 일을 할 수 있지만 솔직히 말해서 매크로가 편집자에게 추가 된 이유입니다. 그래서 지루한 코드를 신속하게 반복 할 수 있습니다.

나는 모든 getters가 호출하는 방법을 만들고 매크로를 사용하여 호출을 만듭니다 (메소드별로 다른 경우). 이 모든 것이 한 번만 이루어져야하고 그냥 잊어 버립니다 ...

여기에 방법이 있습니다. 예쁘지는 않지만 반복보다 선호 할 수도 있습니다.

public class GetterTest extends TestCase {
    private static class Thing {
        public int  accessCount;
        private String  name;
        private int age;

        private <T> T get(T t) {
            accessCount++;
            return t;
        }

        public String getName() {
            return get(name);
        }

        public int getAge() {
            return get(age);
        }
    }

    public void testGetIncrementsAccessCount() throws Exception {
        Thing t = new Thing();
        assertEquals(0, t.accessCount);
        t.getName();
        assertEquals(1, t.accessCount);
        t.getAge();
        assertEquals(2, t.accessCount);
    }
}

분명히, 내 get ()는 AccessCount를 증가시키는 것입니다. 다른 행동을 원하지만 아이디어는 있습니다.

나는 원하는 방법을 호출하기 위해 대상을 근접하게한다고 말할 것이다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top