2013-04-09 3 views
6

Ich habe eine Klasse mit einer Reihe von Feldern, alle privat (Unterklassen Zugriff auf einige mit geschützten Gettern). Ich muss die meisten dieser Felder in eine Methode in einer anderen Klasse übergeben, die sie formatiert und Ausgabe erzeugt. Ist es in Ordnung, eine Methode in der Klasse mit den Feldern zu haben, die sie alle weitergeben? Oder deuten diese Umstände darauf hin, dass ich eine andere Beziehung zwischen den beiden Klassen implementieren sollte, da sie eng miteinander verbunden zu sein scheinen?Java - Ist es in Ordnung, eine Methode zu haben, die private Feldwerte in eine andere Klassenmethode übergibt?

Weitere Informationen: Klasse A stellt Mitarbeiter dar, Klasse B ist nur dafür zuständig, die Ausgabe des Programms zu formatieren.

+0

Müssen Sie die Formatierung der Ausgabe vom 'Mitarbeiter' entkoppeln? Wenn dies der Fall ist, würde ich vorschlagen, ein 'ResourceBundle' zu ​​verwenden, um die Formatierung durchzuführen und die Methode in der' Employee' Klasse zu behalten. –

+0

Danke, das erste Mal habe ich von einem ResourceBundle (ich bin neu dazu) gehört und es jetzt nachgeschlagen. –

Antwort

6

Fragen Sie, ob es in Ordnung ist, das Folgende zu tun?

public class A { 
private B myB = new B(); 
private String myUnformattedName = "some information"; 

public String getFormattedInfo() { 
    return myB.formatInfo(myUnformattedName); 
} 
} 

Das ist vollkommen in Ordnung.

Marking a field as private just means that only the containing class should be able to access it...

Wenn Sie etwas anderes bedeuten, ist es am besten, einige Code in Ihrer Frage Pop Menschen den Zusammenhang


OK zu geben, so gibt es keine Möglichkeit, die Werte hier einstellen, aber man kann sehen, Hier zwei verschiedene Möglichkeiten, den Formatierer aufzurufen. Wenn die Parameterliste über drei oder vier Elemente hinausgeht, wird es schwierig zu lesen.

In diesem Fall würde ich einfach A in den Formatierer übergeben und eine Methode für jeden Wert haben, den B lesen können soll.

public class A { 
private B myB = new B(); 
private String myUnformattedName = "some information"; 
private String myUnformattedNameOne = "some information"; 
private String myUnformattedNameTwo = "some information"; 
private String myUnformattedNameThree = "some information"; 
private String myUnformattedNameFour = "some information"; 
private String myUnformattedNameFive = "some information"; 
private String myUnformattedNameSix = "some information"; 

public String getFormattedInfo() { 
    //pass the object itself and use get methods 
    return myB.formatInfo(this); 
} 

public String getFormattedInfoLong() { 
    //this is OK but gets difficult to read the longer the 
    //parameter list gets 
    return myB.formatInfo(myUnformattedName, myUnformattedNameOne, 
     myUnformattedTwo, myUnformattedNameThree, myUnformattedNameFour, 
     myUnformattedNameFive, myUnformattedNameSix); 
} 

//getters 
public String getUnformattedName() { 
    return myUnformattedName; 
} 

public String getUnformattedNameOne() { 
    return myUnformattedNameOne; 
} 

//etc 

} 
+0

Ja, das sieht so aus! Vielen Dank. –

+0

hm, ist es eigentlich in Ordnung, viele Felder (Strings und Doubles) als Parameter gleichzeitig durch die Methode getFormattedInfo() an das B-Objekt zu übergeben? –

+0

Ja, es wird gerade eine stilistische Sache dann ... wenn die Parameterliste "zu lang" wird, dann gebe die Felder Getter und gebe das Objekt selbst weiter. –

1

Es ist in Ordnung, soweit die Klasse B sie nicht ändert. Wenn die Klasse dies tut, übermittle unveränderliche Instanzen an sie.

2

Ich denke, es ist vollkommen in Ordnung, sie zu übergeben, solange sie entweder primitiven Typ haben oder unveränderlich sind.

Wenn der Angerufene sie ändern kann, wenn es nicht soll, dann haben Sie ein Designproblem.

+0

Großartig, danke! Sie sind entweder Strings oder Doubles und sollten nicht verändert werden. Mit "unveränderlich" ich denke, es ist in Ordnung, wenn die Zeichenfolge Felder privat sind/haben Methoden nur aus der ursprünglichen Klasse + Unterklassen sichtbar? –

+0

Unveränderbare Klassen können nicht geändert werden, sobald sie erstellt wurden. Es wird also alles im Konstruktor gemacht, es gibt keine Mutatoren (Setter), nur Getters. Und sogar Getter produzieren defensive Kopien der Daten, die sie bei Bedarf zurückgeben. Java-Klassen wie String gehorchen dazu. –

1

Sie können Klasse B zu einer Dienstprogrammklasse machen und nur statische Methoden verwenden.

Dann in Ihrer Klasse A können Sie haben etw wie:

public String formatMyVariables() {

Rückkehr B.format (a, b, c, d);

}

Ich nehme an, die Ausgabe, die Sie erwähnt ein String ist, aber es kann alles wirklich sein.

1

Sie sollten bedenken, dass, wenn Ihr Employee Felder primitive Werte (int, boolean) oder unveränderlich diejenigen (wie String zum Beispiel), dann können Sie andere Klassen sie, ohne sich Gedanken lesen lassen.

Der Schutz von Feldern mit private ist die Möglichkeit, das interne Arbeiten Ihres Objekts, das ausschließlich über seine API public erreicht werden kann, nicht zu offenbaren. Wenn Ihre Klasse jedoch wirklich ein Geschäftsobjekt darstellt (dh eine Gruppe von Werten, die eine Entität identifizieren), ist es vollkommen sicher, andere die Möglichkeit zu haben, interne Felder zu lesen.

-1

Der beste Weg, Daten zu übertragen, sind die DTO-Objekte.

Diese Objekte enthalten nur die Instanzvariablen (mit Setter und Getter) als Daten, die Sie übertragen möchten!

sollte

zum Beispiel keine Verhaltensweisen in dieser Klasse, wenn Sie ein Mitarbeiterdaten übergeben möchten, gehen Sie wie

class EmployeeBean 
{ 
private String name; 
private String age; 

public void setName(String n) 
{ 
name=n; 
} 

public String getName() 
{ 
return name; 
} 


public void setAge(int n) 
{ 
age=n; 
} 

public int getAge() 
{ 
return age; 
} 

} 

folgt können Sie nun die EmployeeBean Klasse erstellen, füllen Daten in seinem Instanz Variablen und dann dieses Objekt als Parameter an die Methode in der anderen Klasse übergeben, wo es formatiert werden kann

4

Ich würde tatsächlich das Besuchermuster vorschlagen.

Klasse A eine Methode verfügt, die einen Besucher akzeptiert, was wiederum eine gut definierte öffentliche Methode hat, wie folgt aus:

Erstens ermöglicht die besuchte Klasse einiger Klassen mit gut definierten Schnittstelle, nicht passieren es sind eigene Daten nach außen.

public class A { 
    int data; 

    public void getFormattedBy(Formatter f) { 
     f.format(data); 
    } 
} 

Die Schnittstelle des Besuchers wird mehrere Formatter

public interface Formatter { 
    void format (int data); 
} 

Ein Formatter ermöglicht, dass in dem besuchten Klasse erlaubt.

public class B implements Formatter { 
    public void format(int data) { 
     // do the formatting and printing 
    } 
} 

diese Weise können Sie rufen Sie einfach

A a = new A(); 
B b = new B(); // the formatter 
a.getFormattedBy(b); 

Am Ende ein Besucher (die Forma) können viele Klassen besuchen, die den Besucher in zulassen zulassen, (wahrscheinlich durch die Implementierung einer Schnittstelle auf ihre eigenen) und eine besuchte Klasse kann von vielen Besuchern besucht werden.

+0

Das ist interessant und sieht nach einer guten Lösung aus. Vielen Dank! –

Verwandte Themen