2017-04-11 2 views
0

J'utilise l'énumération pour définir toutes mes variables constantes.Comparaison de nombres dans une chaîne avec Enum

Enum

public enum ApplicationStatus { 
     Initiated(1), PendingVerification(2), NotEligible(3), Approved(4), SoftDenial(
       5), Deferred(6), Saved(7), Cancelled(8), Approved_NoSSN(9), PendingVerification_NoSSN(
       10), Approved_Archived(11); 

     private final int value; 

     private ApplicationStatus(int value) { 
      this.value = value; 
     } 

     public int getStatusMasterId() { 
      return value; 
     } 
    }; 

et je dois comparer deux valeurs entières. Quel est le moyen efficace de comparer les entiers ci-dessous?

Entiers: Comparaison -

public void applicationStatus(){ 
    String applicationStatus = null; 
    String statusMasterId = "2"; 
    if(ApplicationStatus.PendingVerification.ordinal() == Integer.parseInt(statusMasterId)){ 
     applicationStatus = "Pending Verification"; 
    } 
} 

Suggestions Bienvenue!

+0

probablement un 'switch case' – XtremeBaumer

+1

Vous ne voudriez pas utiliser' getStatusMasterId' au lieu de 'ordinal'? Je considérerais aussi avoir une méthode dans 'ApplicationStatus' qui pourrait prendre une valeur' int' et retourner un 'ApplicationStatus', mais c'est juste moi – MadProgrammer

+0

Qu'est-ce que vous essayez d'accomplir? – ajb

Répondre

1

J'ai quelques suggestions. N'hésitez pas à vous défausser s'ils ne vous conviennent pas.

Puisque vous dites que vous avez besoin du nombre ordinal du ENUM, vous pouvez aller dans l'autre:

if (ApplicationStatus.values()[Integer.parseInt(statusMasterId)] == ApplicationStatus.PendingVerification) { 
     // do your stuff 
    } 

Soyez conscient que, comme dans la question Integer.parseInt(statusMasterId) peut jeter un NumberFormatException.

Une autre suggestion, la méthode comparer de la réponse de Jay Smith peut être franchi une étape supplémentaire pour accepter un argument de chaîne:

public enum ApplicationStatus { 
    Initiated(1), PendingVerification(2), NotEligible(3), Approved(4), 
    SoftDenial(5), Deferred(6), Saved(7), Cancelled(8), 
    Approved_NoSSN(9),PendingVerification_NoSSN(10), 
    Approved_Archeived(11); 

    private final int value; 
    // redundant representation of ordinal() as a string for comparison to other strings 
    private final String ordinalAsString; 

    private ApplicationStatus(int value) { 
     this.value = value; 
     ordinalAsString = String.valueOf(ordinal()); 
    } 

    public int getStatusMasterId() { 
     return value; 
    } 

    public boolean compare(String stringValue) { 
     return this.ordinalAsString.equals(stringValue); 
    } 
} 

Il n'y a pas de risque d'un NumberFormatException, mais vous pouvez envisager le risque il y a même pire: Ceci ne reconnaîtra pas par exemple "+2" ou "02" comme représentant le nombre 2. Si vous voulez stocker la valeur de chaîne de manière permanente dans l'objet enum est discutable; Si vous voulez vraiment que la comparaison soit efficace, vous voulez le faire. Le code de Jay Smith utilise le value, je l'ai changé en utilisant ordinal().

Voici le test!

String statusMasterId = "2"; 
    if (ApplicationStatus.values()[Integer.parseInt(statusMasterId)] == ApplicationStatus.NotEligible) { 
     System.out.println("Not eligible"); 
    } 
    if (ApplicationStatus.NotEligible.compare(statusMasterId)) { 
     System.out.println("Still not eligible using the compare() method"); 
    } 

Cette imprime

Not eligible 
Still not eligible using the compare() method 

En effet, ordinaux commence à 0, donc NotEligible, avec une valeur de 3, a ordinal 2, ce n'est pas la même chose.

+0

J'appelle comme ceci, mais il retourne false - if (ApplicationStatus.Initiated.compare (statusMasterId)) { \t \t \t applicationStatus = "Initié"; \t \t \t System.out.println (état de l'application); \t \t} – Aishu

+0

Avez-vous testé le code compare() ... Il retourne faux – Aishu

+0

V.V - Cela fonctionne très bien ... Mais j'essaie d'utiliser le compare() dans ma condition if. Cela revient faux .. Et c'est ma préoccupation – Aishu

1

Vous avez deux options deux comparer enums.

  1. Utilisation de la méthode compareTo de java enum. Voir https://docs.oracle.com/javase/7/docs/api/java/lang/Enum.html#compareTo(E)
  2. Créez votre propre méthode de comparaison au sein de enum. Comme:

    public enum ApplicationStatus { 
        Initiated(1), PendingVerification(2), NotEligible(3), Approved(4), 
        SoftDenial(5), Deferred(6), Saved(7), Cancelled(8), 
        Approved_NoSSN(9),PendingVerification_NoSSN(10), 
        Approved_Archeived(11); 
    
        private final int value; 
    
        private ApplicationStatus(int value) { 
         this.value = value; 
        } 
    
        public int getStatusMasterId() { 
         return value; 
        } 
        public boolean compare(int value) { 
         return this.value==value; 
        } 
    }; 
    
+1

Très bonne information. Je pense que vous avez sauté la partie à propos d'un des nombres entrant dans une chaîne. Peut-être que le demandeur peut s'adapter à cela lui-même. –