2016-07-01 89 views
0

我想創建一個包裝類,該類從庫提供的類中調用靜態方法和成員字段我無法查看代碼。沒有實例化返回對具有靜態方法和靜態字段的類的引用

這是爲了避免當我需要在特定上下文中使用靜態方法時全局成員字段的樣板設置代碼。

我想盡量避免爲每個靜態方法創建包裝方法。

我的問題:

是否有可能從方法返回靜態方法的類來訪問只是靜態方法沒有實例呢?

代碼如下,並附帶註釋。

該代碼用於演示方法getMath()被調用時靜態值的變化。

我想在調用靜態方法之前避免設置該值。

StaticMath.setFirstNumber(1); 
StaticMath.calc(1); 

StaticMath.setFirstNumber(2); 
StaticMath.calc(1); 

我正在使用Eclipse IDE,它提出了警告,據我瞭解,但要避免。

我試過搜索這個主題的東西,所以如果任何人都可以提供一個鏈接,我可以關閉它。

public class Demo { 
    // Static Methods in a class library I don't have access to. 
    static class StaticMath { 
     private static int firstNum; 

     private StaticMath() { 
     } 

     public static int calc(int secondNum) { 
      return firstNum + secondNum; 
     } 

     public static void setFirstNumber(int firstNum) { 
      StaticMath.firstNum = firstNum; 
     } 
    } 

    // Concrete Class 
    static class MathBook { 
     private int firstNum; 

     public MathBook(int firstNum) { 
      this.firstNum = firstNum; 
     } 

     // Non-static method that gets the class with the static methods. 
     public StaticMath getMath() { 
      StaticMath.setFirstNumber(firstNum); 
      // I don't want to instantiate the class. 
      return new StaticMath(); 
     } 
    } 

    public static void main(String... args) { 
     MathBook m1 = new MathBook(1); 
     MathBook m2 = new MathBook(2); 

     // I want to avoid the "static-access" warning. 
     // Answer is 2 
     System.out.println(String.valueOf(m1.getMath().calc(1))); 
     // Answer is 3 
     System.out.println(String.valueOf(m2.getMath().calc(1))); 
    } 
} 
+0

爲什麼不'StaticMath.calc(1)' –

+5

這種設計(設置'firstNum')是壞的,只有靜態方法的類應該是無狀態 –

+0

@JoopEggen當M1和m2被實例化,'firstNum'值分別被設置爲1和2。問題是我需要在調用'StaticMath.calc()'之前調用'StaticMath.setFirstNumber()'。 – JasonTolotta

回答

1

您不應該通過對象引用調用靜態方法。您應該直接使用類引用來調用靜態方法是這樣的:

StaticMath.calc(1) 

但是,如果你仍然需要它的一些原因,你可以在getMath方法返回null,但你仍然會得到警告在Eclipse:

public StaticMath getMath() { 
    StaticMath.setFirstNumber(firstNum); 
    return null; 
} 
+0

'你應該通過一個對象引用調用一個靜態方法'?或者你的意思是「不應該」? –

+0

是更正了答案 – Tanrikut

+0

@JasonTolotta你有沒有發佈這樣的設計非常糟糕,特別是如果你在多線程環境中使用它?你的對象引用了相同的靜態值,這會導致錯誤的計算。靜態方法應該獲取所有參數作爲方法參數以避免這種情況 – Tanrikut

1

我推斷這個問題沒有正確詢問如果答案是不

StaticMath.calc(1) 

,你可能會面臨由於封裝能見度靜態內部類的其他問題。這是Demo類作者的設計選擇。如果你可以標記你的類MathBook和StaticMath公衆,那麼你可以像下面訪問它們:

Demo.StaticMath.calc(1); 
+0

嗯,讓我們假設內部類是在單獨的文件中。 – JasonTolotta

2

我只是把它包起來,使一個原子操作:

public static class MyMath{ 

    public static synchronized int myCalc(int num1 , int num2){ 
     StaticMath.setFirstNum(num1); 
     return StaticMath.calc(num2); 
    } 

} 

缺點:你會必須確保,StaticMath不用於避免這種「橋接」類。

用法:

int result1 = MyMath.myCalc(1, 1); 
int result1 = MyMath.myCalc(2, 1); 
相關問題