簡體   English   中英

從另一個類獲取變量的正確方法

[英]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的一部分。

為了封裝,你應該總是選擇第二種方法。

myLocalVar = myClass.getMyVarVal();

效率明智,你很可能不會注意到差異。

總是使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM