2013-04-09 92 views
6

我有一堆領域的類,所有私人(子類訪問一些與受保護的getters)。我需要將大部分這些字段傳遞給另一個類中的方法,這些方法將對它們進行格式化並生成輸出。在課堂上有一個方法可以讓所有的字段通過嗎?或者,這些情況是否表明我應該在這兩個階級之間實施一些其他關係,因爲他們似乎緊密結合在一起?Java - 可以將私有字段值傳遞給另一個類的方法嗎?

更多信息:A類代表員工,B類唯一的責任是格式化程序的輸出。

+0

您是否需要將'Employee'輸出的格式解耦?如果是這樣,我會建議使用一個'ResourceBundle'來進行格式化並將該方法保留在'Employee'類中。 – 2013-04-09 10:30:01

+0

謝謝,我第一次聽說ResourceBundle(我是新手)並現在查找它。 – 2013-04-09 10:38:55

回答

6

您問是否可以執行以下操作?

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

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

這很完美。

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

如果你的意思是別的東西,最好彈出你的問題一些代碼來給人們上下文


OK,所以沒有辦法在這裏設置的值,但你可以看到這裏有兩種不同的方式來調用格式化程序。當參數列表超過三個或四個項目時,它很難閱讀。

在這個例子中,我只是將A傳遞給格式化程序,併爲每個您希望B能夠讀取的值設置get方法。

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

是的,看起來像它!謝謝。 – 2013-04-09 10:43:13

+0

hm,實際上可以通過getFormattedInfo()方法同時將很多字段(字符串和雙精度)作爲參數傳遞給B對象嗎? – 2013-04-09 10:47:15

+0

是的,它只是成爲一種風格的東西,然後...如果參數列表變得「太長」,然後給字段getters和傳遞對象本身。 – 2013-04-09 13:05:37

1

只要B類不修改它們就可以。如果該類確實做了,則將不可變實例傳遞給它。

2

我認爲將它們傳遞給它們是完全正常的,只要它們具有原始類型或不可變。

如果被調用者可以修改他們不應該的時候,那麼你有一個設計問題。

+0

太好了,謝謝!他們是字符串或雙打,他們不應該被修改。通過「不可變」,我猜如果字符串字段是私有/已設置方法只能從原始類+子類可見,那麼可以嗎? – 2013-04-09 10:34:17

+0

不可變類一旦創建就無法更改。所以一切都在構造函數中完成,沒有變體(setters),只有getter。即使是獲得者,如果需要的話,他們也會產生防禦性的數據副本。像String這樣的Java類服從於此。 – 2013-04-09 10:47:57

1

您可以使B類成爲工具類,並且只有靜態方法。

那麼你的類裏面,你可以有某事像:

公共字符串formatMyVariables(){

回報B.format(A,B,C,d);

}

我想你提到的輸出是一個字符串,但它可以是任何東西真的。

1

你應該考慮的是,如果你的Employee字段的原始值(intboolean)或不可變者(如String爲例),那麼你就可以讓其他班念他們不用擔心。

使用private保護字段是不暴露對象的內部工作的方式,它可以通過其public API完全訪問。但是,當你的類真正代表一個業務對象(即一組識別實體的值)時,讓其他人閱讀內部字段是完全安全的。

-1

傳輸數據的最佳方式是DTO對象。

這些對象只包含實例變量(帶有setter和getters)作爲要傳輸的數據!

應該有這個類

例如無行爲,如果你想傳遞一個Employee數據,做如下

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

} 

您現在可以創建引用EmployeeBean類,在它的實例填充數據變量,然後將該對象作爲參數傳遞給其他類中可以格式化的方法

4

我實際上會建議訪客模式。

A類具有接受一個訪問者,這反過來又具有良好定義的公共方法,像這樣的一個方法:

首先,訪問類允許一些類與在明確定義的接口,不傳它是自己的數據傳到外面。

public class A { 
    int data; 

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

訪問者所述的界面,允許多個格式化

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

格式化器,其被允許進入被訪問的類。

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

這種方式,您只需撥打

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

最後,訪問者(格式化)可訪問許多類,允許允許訪問者(可能通過實現自己的界面),並且訪問類可以被許多訪問者訪問。

+0

這很有趣,看起來像一個很好的解決方案。謝謝! – 2013-04-09 10:41:39

相關問題