[英]Proper way of getting variable from another class
我可以用2種方式調用變量。
一個就是這樣做:
MyClass myClass = new MyClass();
myLocalVar = myClass.myVarVal;
另一種方法是使用這樣的getter:
myLocalVar = myClass.getMyVarVal();
兩種方式都運行良好,但我想知道最有效/最合適的方法是什么?
謝謝
這兩種技術都很糟糕,但使用吸氣劑是常見的(也是更安全的)做法。
要訪問類的公共數據成員(也稱為公共字段或公共屬性),您必須知道類的實現詳細信息(數據成員名稱和數據成員類型)。 這是件壞事; 它打破了OOP概念“信息隱藏”並增加了“耦合”。
使用getter也很糟糕(就像在糟糕的OOP實踐中一樣)因為對象不僅僅是數據包裝器; 對象應該封裝功能和數據。 “將此存儲在這里,以便我以后可以得到它”不是功能; 它是hoot功能(就像在籠子里的猴子一樣)。 吸氣劑是; 但是,java中的公認實踐(以及其他OOP-lite語言,如c ++和c#)。
為免你認為我是象牙塔最純凈,當然我使用吸氣劑; 我使用java,所以我使用getter。
吸氣劑可以完成工作(沒有雙關語),只是不要相信“IR gud OOP Prgmr”,因為如果你使用吸氣劑你不是一個“好的oop程序員”,你只是一個程序員得到的完成工作。
編輯:也許是一種更好的方式。
更好的方法是不使用getter,而是設計類,以便它們暴露功能而不是數據。 在實踐中,有一個地方會崩潰; 例如,如果需要在JSP頁面上顯示地址,則將bean放在請求(或會話或blah)中,並使用地址並使用getter公開值。 “更純粹的純粹”方式是將暴露的“bean顯示在jsp上的地址”功能。
Edit2:也許是一個更好的例子。
說我在美國的一家電話公司工作,我有一個代表客戶電話號碼的對象。 這可能如下所示:
public class CustomerPhoneNumber
{
private String npa; // numbering plan area (google search nanp for more details)
private String nxx; // exchange.
private String serviceNumber;
public String toString()
{
return "(" + npa + ") " + nxx + "-" + serviceNumber;
}
public boolean equals(Object object)
{
... standard equals implementation (assume this works)
}
}
現在說我從網頁中輸入一個電話號碼作為輸入,格式為String inputPhoneNumber
。 出於討論的目的,接收此輸入的類稱為“servlet”。
我該如何回答這個問題:“我的CustomerPhoneNumber對象列表中的輸入電話號碼是?”
選項1是使npa,nxx和serviceNumber數據成員公開並訪問它們。 這真糟糕。
選項2提供npa,nxx和服務號的getter,並將它們與輸入進行比較。 同樣可怕的是,太多的內部細節暴露無遺。
選項3提供了一個getter,它返回格式化的電話號碼(我在上面稱之為toString())。 這更聰明但仍然很糟糕,因為servlet必須知道getter將使用的格式並確保輸入的格式相同。
選項4(我稱之為“歡迎使用OOP”)提供了一個接受String的方法,如果匹配客戶服務號,則返回true。 這樣更好,可能看起來像這樣(名稱很長,但對於這個例子來說足夠了):
public boolean doesPhoneNumberMatchThisInput(final String input)
{
String formattedInput;
String formattedCustomerPhoneNumber = npa + nxx + serviceNumber;
formattedInput = ... strip all non-digits from input.
return StringUtils.equals(formattedCustomerPhoneNumber, formattedInput);
}
這是贏家,因為沒有公開實施細節。 此外,toString可用於在JSP頁面上輸出電話號碼。
StringUtils是Apache Commons Lang的一部分。
總是使用getter和setter來訪問你的屬性!
你也應該看看這個 。
只需創建object和object.variablename;
或object.methodName();
可用於制作非靜態參考...不需要使用吸氣劑。
myClass.getMyVarVal()
較慢,因為它是一個方法調用,因此它在堆棧上創建了返回值等的入口。但是使用getter是更好的OOP實踐。
myLocalVar = myClass.getMyVarVal();
如果您正在使用OOP
概念,那么使用它會很好
Tomcat + Heroku + Maven項目:
如何引用Main類靜態變量:
HEROKU_PRJ_FOLDER的\\ src \\主\\ java的\\ servlet的\\ HelloServlet.java:
import launch.Main;
String my_str = Main.TEST_STRING;
HEROKU_PRJ_FOLDER的\\ src \\主\\ java的\\啟動\\ Main.java
package launch;
....other imports here....
public class Main {
public static final String
TEST_STRING = "[TEST_STRING]";
public static void main(String[] args){
...somelogic...
};
};
這可能適用於任何Tomcat項目,但我使用Tomcat + Heroku + Maven完成了這項工作。 發表答案,因為我能找到的最接近的問題就是這個,我已經知道該怎么做,只是確切的導入路徑,我發現我的特定問題有點混亂。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.