2011-10-27 5 views
2

J'essaie de déterminer si ce que je veux faire est encore possible. J'ai regardé autour et google n'a pas été super utile, au moins dans ce cas précis.Utilisation de méthodes sur des classes anonymes

Voici ce que j'essaie de faire. L'affectation sur laquelle je travaille est conçue pour être exécutée plusieurs fois à partir de la ligne de commande, avec deux ensembles d'arguments possibles: ["CREATE" "cardType"] ou ["VERIFICATION" "accountNumber" "transactionAmout"]. Chaque fois qu'un indicateur "CREATE" est passé, une instance anonyme de la classe est créée - le constructeur crée les différents champs de données associés à la classe, et les écrit dans un fichier, et le programme se ferme. D'accord jusqu'ici. Voici un extrait du constructeur (il y a plusieurs d'entre eux, mais ils sont tous à peu près identiques):

if(issuer.compareTo("AE") == 0) 
    { 
     try 
     { 
     cardType = "American Express"; 
     firstDigit = 3; 
     accountNumber = accountNumberGen(firstDigit);    
     memberSince = new java.util.Date(); 
     limit = setLimit(accountNumber); 
     output.write(accountNumber + "|" + cardType + "|" + 
       memberSince + "|" + limit + "\r\n"); 
     } 
     catch(Exception e) 
     { 
      System.out.printf("An unexpected error occured. Sorry.\n" 
        + "American Express Constructor."); 
      System.exit(0); 

     } 

Alors, voici ce que je l'essaie de comprendre. L'étape suivante est le drapeau "VERIFICATION". Si l'indicateur de vérification est passé à partir de la ligne de commande, je dois aller dans le fichier, lire les données qui y sont stockées, apporter des modifications et les réécrire dans le fichier. Encore une fois, d'accord pour l'instant. Voici le problème:

Puisqu'il n'y a aucune instance de la classe, je ne peux pas invoquer des méthodes dans la classe. Cependant, la méthode de vérification n'a pas besoin d'une instance de la classe pour faire son travail - elle traite entièrement les arguments de la ligne de commande, et la lecture/écriture dans le fichier. Alors, comment puis-je invoquer anonymement des méthodes dans une classe? Dois-je créer une autre classe de vérification, ou simplement déplacer la méthode dans ma classe principale? Je suis un peu hésitant à propos de l'un ou de l'autre, parce que l'affectation implique qu'il devrait y avoir une classe qui gère la création et la vérification. Ou, une autre possibilité, est ma logique en abordant ce problème juste imparfait?

Ce code est un travail en cours - exceptions deviendront plus spécifiques et les filestreams ouverts vont être fermés, etc.

+1

Quel constructeur est qu'un extrait de s'il n'y a pas de classe? Je pense que nous avons besoin de quelques détails concernant la structure réelle de l'objet ici. Aussi, quel contrôle avez-vous sur l'un de ces? Il semble que vous devriez utiliser une interface avec de nombreuses classes d'implémentation (ou une super-classe abstraite). – Thor84no

+0

Voici ce que je veux dire par anonyme, je pourrais avoir utilisé à une mauvaise terminologie ... 'public static void main (String [] args) throws Exception { inputValidation (args); Si (args.length == 2) nouveau compte (args [1]) } ' – MikeTheLiar

Répondre

2

Si je comprends bien votre question/devoir (et je ne suis pas sûr que je le fais, quelles sont exactement les exigences de la mission? Est-il nécessaire d'utiliser des classes anonymes? Il n'y a vraiment pas de méthode anonyme dans Java, uniquement les classes anonymes.), Il semble que vous souhaitiez une classe de vérification unique ou une méthode statique.

La méthode unique:

Verification v = new Verification(commandLineArgs); 
v.verify(); 
// Done with 'v' 

La méthode statique ...Méthode:

Verification.verify(commandLineArgs); 

Lorsque la méthode est définie dans la classe comme:

public class Verification { 
    ... 
    public static void verify(String ... commandLineArgs) { 

    } 
    ... 
} 
+0

Ce son prometteur. Je pense que cela pourrait être le chemin à parcourir. – MikeTheLiar

+0

Mise à jour .... eu ce travail, merci beaucoup. J'ai une autre question, cependant, à cause du fait que j'utilise toujours des appels anonymes: new Account (args [1]); nouvelle vérification (args [1], args [2]); Serait-il préférable de les nommer, même si elles ne servent à rien après leur déclaration? Les classes elles-mêmes font tout ce qui doit être fait (écriture, lecture, traitement, etc.). Ou, mes cours sont-ils mal conçus? – MikeTheLiar

+0

Si tout ce que vous faites est d'appeler les constructeurs, alors vos classes sont mal conçues. Vous devez tirer le code du constructeur dans une méthode statique. (La seconde méthode que j'ai suggérée.) Les constructeurs ne devraient être utilisés que pour l'initialisation des variables d'instance et tout autre type d'installation ** requis ** pour que cet objet soit utilisé, mais toute exécution supplémentaire est généralement mal vue. –

3

un acronyme: KISS:

Oui, vous pouvez faire toutes sortes de la magie, les méthodes d'appel par la réflexion, etc. Mais pourquoi s'embêter?

Créez une méthode principale qui prend le premier argument et crée un CreateHandler ou un VerificationHandler. Les deux implémenter l'interface Handler qui a cette méthode:

void run(String[] args); 

Ainsi, après l'interrupteur, vous pouvez appeler le nouveau gestionnaire avec handler.run(args), peu importe laquelle il est.

Les gestionnaires peuvent alors examiner les lignes de commande pour trouver ce que l'utilisateur veut.

Déplacez le code commun (comme le chargement/l'enregistrement) dans les classes auxiliaires. Gardez les méthodes courtes (5-15 lignes). Chaque méthode devrait faire une chose. Déplacer des tâches complexes dans des méthodes d'assistance.

+0

Je suis d'accord - une interface commune entre les deux classes Create/Verification aiderait considérablement. –

+0

Cela semble être très utile, mais je pense que cela pourrait être un peu au-delà de mes connaissances, et travailler contre une date limite n'est pas vraiment le meilleur endroit pour essayer de nouvelles choses. Merci pour les conseils, cependant. – MikeTheLiar

+0

Après réflexion/recherche, je pense que c'est plus ou moins ce que j'essaie d'accomplir sans l'avantage de savoir à propos des gestionnaires quand j'ai commencé. Essentiellement, (si je comprends bien les gestionnaires), j'ai transformé mes cours en gestionnaires. Merci encore, votre suggestion a été très utile, même si je n'ai pas fini par l'utiliser, je le ferai certainement dans le futur. – MikeTheLiar

Questions connexes