有没有一种方法来定义一个方法,这是每次叫我叫走?

我有物体接触,并且不希望设置updateLastUsed();在约30吸气剂为我的成员。

有帮助吗?

解决方案

我会建议AOP但如果它是J2ME我们在谈论你最有可能更好手动插入“onGetCalled()”中的每个30个存取,然后编码任何你需要的是方法中。您可能需要在方法的名字来传递被称为(或属性访问)的情况下,你需要它的未来。

其他提示

而不是访问您的属性的getter的,你可以创建,是以属性名称作为输入一个普通的getter。返回类型将需要对象,如果你的属性是不同类型的。

在此一般吸气调用属性getter和updateLastUsed()方法。为了安全起见使所有属性获取私人。

可以在一个呼叫添加到每个方法(镗孔),或使用某种形式的AOP(例如AspectJ中,下面的例子),以匹配该类型的吸气剂,并调用updateLastUsed()方法。

编辑:一些人指出吸气剂30是一个代码的气味并调用另一方法是一种副作用。第一条语句是一个公平的指标,但并不是规则。可能有很多原因,有这种类型的,没有进一步的信息我会离开它作为建议检查是否可以职责分离成两个或更多类型。

关于副作用的另一点可以或可以不相关的。有许多横切关注它使SENS适用于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*开始

在“新”的AspectJ 5东西支持使用注解来定义方面的切入点,所以你可以注释你的干将有叫切入点@Before执行方法的主体。

使用正则表达式来调用该方法附加到吸气头。

查找

  

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

替换为:

  

\0updateLastUsed();\1

这些表达式是在使用利用“全部替换”的Eclipse 3.5(伽利略)测试了“查找/替换”对话框。

请注意,您使用的编辑器必须支持多匹配(或您必须启用它)。对于EmEditor的8.05,我不得不修改搜索字符串是:

  

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

,以使新线被明确地匹配。替换字符串仍保持原样。

您可以做一些花哨的,但说实话,这就是为什么宏被添加到编辑器,让您可以快速重复枯燥的代码。

我只想使该方法由所有吸气剂被调用,然后使用宏创建呼叫(如果它需要通过方法不同)。这一切只需要进行一次,然后你就忘了这件事......

这里的一个方式。这是不漂亮,但你可能更喜欢到反复:

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,你会想一些其他的行为,但这个想法是存在的。

我要说proxify的对象调用所需的方法。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top