2011-06-30 47 views
1

我需要從屬性文件獲取屬性值,然後將其傳遞給超類構造函數。但由於super(value);應該先調用,我應該在哪裏加載文件並獲取屬性值?獲取屬性值並將其傳遞給超類

回答

4

您需要首先加載屬性文件,您只能在靜態方法中執行此操作。這聽起來像你真的需要一個工廠方法。

public static MyType fromProperties(String filename) { 
    Properties prop = new Proeprties(); 
    prop.load(filename); 
    return new MyType(prop.getProperty("name")); 
} 
+0

然後我調用'super(fromProperties(filename));'在子類構造函數中? – aps

+0

這是第一個選項,在第二個選項中,您不需要執行此操作,因爲您需要的任何值都將由工廠方法加載。 –

+0

但爲什麼不應該在方法之外聲明? – aps

0

您可以使用此方法:

class FooWrapper { 
    private Foo foo; 
    public FooWrapper() { 
     Properties p = ...; 
     foo = new Foo(p.getProperty("smth")); 
    } 

    public Foo getFoo() { 
    return foo; 
    } 
} 

,或者,如果你可以改變美孚,改寫不要在構造函數中使用的字符串,而是利用特殊的init()方法:

class FooWrapper extends Foo { 
    public FooWrapper() { 
     Properties p = ...; 
     foo = new Foo(); 
     foo.init(p.getProperty("smth")); 
    } 

} 
+0

富是一個抽象在我的情況下,類。而且爲什麼我應該從我的子類創建Foo的另一個對象?當我的子類被創建時,已經調用了超類的構造函數。無論如何,因爲Foo是抽象的,我不能從任何子類創建它的一個對象。 – aps

0

您可以在超類中顯式地使用setter方法來設置該值,然後從子類調用該方法進行初始化。

0

有許多選項,最簡單的是在超類中使用受保護的init(TypeOfValue)方法,或者使用工廠方法而不是子構造函數。

0

你應該在你的應用程序加載一次您的屬性文件並確定它爲static公共常量,你可以在你的構造函數直接訪問:

public class Foo { 

    public static final PropertyFile pFile = ... 

    public Foo() { 
     super(pFile.getProperty("...")); 
     ... 
    }  

} 
0

另一種選擇:

public abstract class SuperClassLoad { 

    private String name; 

    public void setName(String name) { 
     this.name = name; 
    } 

    public void getName() { 
     return name; 
    } 
} 

public class ClassLoad extends SuperClassLoad { 

    public ClassLoad() { 
     super(); 
     Properties prop = new Proeprties(); 
     prop.load(filename); 
     super.setName(prop.getProperty("name"))); 
    } 
} 
+0

中所做的那樣,我實際上已經完成了這一步。但我希望所有的子類都將特定變量的值傳遞給超類。不管怎樣,謝謝。 – aps

相關問題