Frage

Gibt es eine Möglichkeit, ein Verfahren zu definieren, die jedes Mal aufgerufen wird, nenne ich eine bekommen?

Ich habe ein Objekt Kontakt und will nicht gesetzt updateLastUsed (); in etwa 30 Getter für meine Mitglieder.

War es hilfreich?

Lösung

Ich habe AOP vorgeschlagen würde, aber wenn es J2ME ist wir reden über Sie wahrscheinlich besser dran manuell Einfügen „onGetCalled ()“ in jedem der 30 Zugriffs- und dann Codierung, was Sie innerhalb dieser Methode benötigen. Sie können in Namen der Methode übergeben werden sollen aufgerufen wird (oder Eigenschaft zugegriffen wird), wenn Sie es in der Zukunft brauchen.

Andere Tipps

Statt die Getter für den Zugriff auf Eigenschaften, könnten Sie eine allgemeine Getter erstellen, die den Namen der Eigenschaft als Eingabe verwendet. Der Rückgabetyp sein müßte Objekt, wenn Ihre Eigenschaften sind von verschiedenen Arten.

In diesem allgemeinen Getter rufen Sie die Eigenschaft Getter und die updateLastUsed () -Methode. Um sicher zu sein make alle Eigenschaft Getter privat.

Sie können in einem Aufruf jeder Methode (langweilig), oder verwenden Sie eine Form von AOP (z AspectJ, für ein Beispiel) in der Getter der Typ entsprechen und die updateLastUsed () -Methode aufrufen.

Edit: Einige Leute haben 30 Getter darauf hingewiesen, ist ein Code Geruch und eine andere Methode aufgerufen ist ein Nebeneffekt. die erste Anweisung ist ein fairer Indikator, aber keine Regel. Es könnte viele Gründe geben, diese Art von Typ zu haben, ohne weitere Informationen, die ich es als Rat verlassen würde zu überprüfen, ob Sie Verantwortung in zwei oder mehr Arten trennen können.

Der andere Punkt über Nebenwirkungen kann oder nicht relevant sein. Es gibt zahlreiche Querschnitts handelt es sich sens Methoden anzuwenden, um Getter macht. Zum Beispiel Logging, Authentifizierung und Caching. Das beispielhafte Verfahren updateLastUsed () könnte Teil einer Caching-Strategie, so unqualifizierte Kritik an der Frage meiner Meinung nach unverdient ist, sein.

Ein Beispiel, wie die pointcut und Beratung in AspectJ zu implementieren, ist wie folgt:

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();
    }       
}

So etwas wie AOP wäre notwendig, um dies zu tun. Ich weiß nicht, wie gut unterstützt, die auf J2ME andere ist als this .

Neben AOP, könnten Sie eine java.lang.reflect.Proxy verwenden oder Bytecode-Manipulation ...

Aber nicht auf J2ME

Ich empfehle Aufruf updateLastUsed () 30-mal.

Das sieht wie ein Job für Aspect Oriented Programming (AOP).

definiert Aspekt für alles ausgeführt werden, die mit get* beginnt

Die „neuen“ AspectJ 5 Sachen unterstützen die Verwendung von Annotationen Aspekt pointcuts zu definieren, so dass Sie Ihre Getter mit Anmerkungen versehen könnten pointcut @Before den Körper des Verfahrens haben ruft auszuführen.

Verwenden Sie einen regulären Ausdruck der Methodenaufruf an die Getter-Header anzufügen.

Suchen:

  

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

Ersetzen mit:

  

\0updateLastUsed();\1

wurden diese Ausdrücke getestet Eclipse 3.5 (Galileo) mit "Alle ersetzen" in der "Suchen / Ersetzen" -Dialog.

Beachten Sie, dass der Editor Sie verwenden müssen mehrzeilige Matching unterstützen (oder haben Sie es aktivieren). Für EmEditor 8,05 hatte ich die Suche zu ändern sein:

  

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

, so dass die neue Linie explizit abgestimmt ist. Der Ersatz-String bleibt wie es ist.

Sie könnten etwas Ausgefallenes tun, aber ehrlich gesagt ist dies, warum Makros wurden für die Redaktion hinzugefügt, so dass Sie schnell langweilig Code wiederholen kann.

Ich würde nur die Methode mache von allen Getter genannt zu werden, und dann einen Makro verwenden, den Anruf zu erstellen (wenn es nach der Methode unterscheidet erforderlich). Das alles hat nur einmal durchgeführt werden und dann vergessen Sie nur darüber ...

Hier ist ein Weg. Es ist nicht schön, aber man könnte es auf die Wiederholung bevorzugen:

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);
    }
}

Offensichtlich meine get () ist accessCount nur erhöht wird, und Sie werden ein anderes Verhalten wollen, aber die Idee ist da.

Ich würde sagen, Proxify das Objekt die gewünschte Methode zu nennen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top