2017-06-24 1 views
0

Ich arbeite an einem Projekt, das drei bestimmte Tickettypen mit bestimmten Eigenschaften benötigt.In Java können Sie Getter und Setter in einer parametrisierten Weise verwenden, d. H. Einen Code übergeben, um zu entscheiden, welche Klassenvariable

Einige dieser Eigenschaften sind endgültig und statisch, da sie sich nicht ändern sollten, jedoch könnten weitere Typen erforderlich sein. Dies würde Änderungen an der abstrakten Klasse bedeuten, aber nicht an der Klasse, die sie implementiert. Ich habe eine abstrakte Klasse erstellt, die diese Klassenvariablen enthält, um die Logik zu begrenzen, die ich schreiben muss, um die Werte zu implementieren. Ich habe Getter-Methoden geschrieben, die einen Parameter (einen Tickettyp-Code) erhalten, und dann schaltet die Methode den Code um und gibt den entsprechenden Wert zurück. In den Setter-Methoden erhalte ich einen Code-Parameter und aktualisiere dann die Klassenvariable abhängig vom empfangenen Code.

Meine Fragen sind:

1.Is diese schlechte Praxis, wenn so sollte ich das Design meiner Klasse revidieren? 2. Und wenn ja, wie sollte ich das Problem so angehen, dass ich den Code wiederverwendbar und parametergesteuert machen kann?

Früher hätte ich eine XML- oder Parameterdatei erstellt, so dass ich die Parameterdatei ändern konnte, anstatt Codeänderungen vorzunehmen, aber ich habe seit ein paar Jahren nicht in Java programmiert und lerne immer noch die Best Practices.

ist hier ein Code-Schnipsel.

private static final int iPickThreeLimit = 50; 
private static final int iPickFourLimit = 40; 
private static final int iPickFiveLimit = 60; 

private static int iPickThreeCount = 50; 
private static int iPickFourCount = 40; 
private static int iPickFiveCount = 60; 

protected static void setTicketCount(String sTicketType) { 

    switch (sTicketType) { 
    case "PickThree": 
     AbstractLotteryMachine.iPickThreeCount = iPickThreeCount--; 
     break; 
    case "PickFour": 
     AbstractLotteryMachine.iPickFourCount = iPickFourCount--; 
     break; 
    case "PickFive": 
     AbstractLotteryMachine.iPickFiveCount = iPickFiveCount--; 
     break; 
    } //end switch 
} // end setTicketCount 

protected static int getPickLimit(String sTicketType) { 
    int iTicketLimit = 0; 

    switch (sTicketType) { 
    case "PickThree": 
     iTicketLimit = iPickThreeLimit; 
     break; 
    case "PickFour": 
     iTicketLimit = iPickFourLimit; 
     break; 
    case "PickFive": 
     iTicketLimit = iPickFiveLimit; 
     break; 
    } //end switch 
    return iTicketLimit; 

    } //end getPickLimit 

Wenn ich in ein individuelles Getter und Setter-Methode für jeden Kartentyp dieser Ballons die Logik erforderlich in der Klasse I diese abstrakte Klasse bin die Umsetzung habe schreiben

+0

warum nicht eine unveränderliche Klasse verwenden, mit statischen Factory-Methoden für jeden Typ? –

+0

Ein Schalter wie dieser ist meistens eine schlechte Idee. Sie verwenden Polymorphie, damit jede spezifische Unterklasse entscheidet, was passieren soll. Also überschreiben Sie Methoden, anstatt einen typbasierten Switch in der Basisklasse auszuführen. – GhostCat

+0

@GhostCat In diesem Fall funktionieren Override-Methoden nicht, weil die Signatur identisch ist? –

Antwort

1

Ich schlage vor, in eine Enum-Variable zu schauen; Sie funktionieren als statisch und können Werte enthalten.

public enum Pick 
{ 
    PickThree(30), 
    PickFour(40), 
    PickFive(50); 

    private int limit; 

    private Pick(int i) { limit = i; } 

    public int getLimit() { return limit; } 
} 

jetzt Ihre andere Klasse (n) kann einen Pick Typen Variable, die alle eine davon halten können, und verwenden Sie diese Variable/Klasse getLimit() Methode, um die Zahl zu erhalten. Der Enum-Typ kann auch andere Logik haben, dies deckt nur das ab, was Sie in Ihrer Frage haben.

+1

Das ist wirklich nur ein Kommentar. – GhostCat

+0

Das erfordert immer noch, dass ich das Limit durchlasse, das ich möchte? Ich muss in der Lage sein, irgendeinen Wert basierend auf dem Code zu erhalten, so dass ich keine hartcodierte Logik für jeden Typ schreiben muss. Auch dies berücksichtigt nicht die Klassenvariable, die dekrementiert werden muss. –

+0

Der einzige Ort, an dem Sie "eine Grenze überschreiten", ist der Konstruktor der spezifischen Enum; Dies entspricht den Statements "private static int", die Sie festgelegt haben. Sie überschreiten nicht das gewünschte Limit (getLimit hat keine Parameter); Ich dachte, das wäre eine "Art von Ticket". Sobald Sie Ihre "Pick" -Variable auf den richtigen Typ gesetzt haben, sagen Sie zu einer Variablen namens "pickType", dann können Sie "pickType.getLimit()" verwenden, um die fest codierte Zahl zu erhalten. Wenn die Nummer irgendwo gespeichert werden muss, so dass sie unter bestimmten Bedingungen dekrementiert werden kann, würde ich erwarten, dass sie anderswo behandelt wird. – arcy

0

Ich denke, der unveränderliche Ansatz ist viel sauberer.

public final class Ticket { 

    private final int pickCount; 
    private int pickThreeLimit=50; 

    private Ticket(int count, int limit){ 
     this.count = count; 
     this.limit = limit 
    } 

    pubic int getTicketLimit(){ 
     return this.pickThreeLimit; 
    } 

    public in getTicketCount(){ 
     return this.count; 
    } 

    //add more static methods for each ticket type 
    public static Ticket createPickThree(){ 
    this.pickThreeLimit--; 
    return new Ticket(50,pickThreeLimit); 
    } 
}