簡體   English   中英

Java類中的多個構造函數

[英]Multiple constructors in a Java class

我對構造函數有些懷疑。

可以在三個不同的“狀態”中創建一個“ Foo”類,我們可以將它們稱為“ YOUNG”,“ ADULT”和“ OLD”。

我要強調的是,不能將它們視為不同的類,因為對象將演變,並且如果將其創建為“ YOUNG”,則將變為“ ADULT”,然后變為“ OLD”,依此類推。

我的問題是:如何定義一個或多個構造函數以使這三種類型多樣化?

我看到了一些可能性,但是沒有人是一種“優雅”的解決方案。

1)創建一個以int為輸入的構造函數

public Foo(int i)
{
    switch (i)
    {
         case 0:
         .
         .
         .
         case 1:
         .
         .
         .
         case 2:
         .
         .
         .
    }
}

但我不喜歡它,因為不清楚是否有人看到此代碼。

2)創建一個空白的構造函數,然后創建三種不同的方法,例如

public Foo()
{

}

public void setYoungFoo()
{
    .
    .
    .
}

public void setAdultFoo()
{
    .
    .
    .
}

public void setOldFoo()
{
    .
    .
    .
}

這可能是解決問題的明確方法,但我會在構造函數中解決此問題。

3)靜態變量在這種情況下有用嗎?

public static final String "YOUNG";
public static final String "ADULT";
public static final String "OLD";


public Foo(String field)
{

}

我不知道如何填充此構造函數,因為我從未使用過靜態最終變量(即使沒有在構造函數中使用,我也看到它們在某些Java類(如Calendar)中使用)。

您能否評論這三個選項以強調它們的缺點什么,因為我非常確定它們不是一個好的解決方案。

使用方法1,但使用枚舉而不是int。 您甚至可以內聯該類中的枚舉,只需使其成為公共靜態即可。

class Foo {
    public static enum fooState {
       young, adult, old;
    }

    public Foo(fooState i) {
        switch(i) {
        case young: ... break;
        case adult: ... break;
        case old: ... break;
        default: throw new InvalidStateException();
    }
    ...
}

編輯 :您要求您對3個選項的意見,這是我的:

  1. 選項1從技術上講與我的版本相同,但是使用了幻數(即沒有指定名稱的數字),這使其更難以理解(對於其他人和您將來的自我而言​​)
  2. 選項2使類在對象創建與對set * Foo()的調用之間處於未定義甚至無效的狀態。 如果您可以隨時轉換為Young / Adult / Old,則可以選擇在構造函數中將Object設置為例如Young狀態,並讓用戶使用已經必要的功能切換到另一個狀態。 這是一個不錯的選擇,但要視情況而定,但這是有效的選擇。
  3. 選項3與選項1基本相同,只是速度較慢,因為它涉及字符串比較。 如果您調用“ new Foo(Foo.YOUNG)”,則該代碼更易於閱讀,但是必須以這種方式編寫代碼並不直觀。 同樣,有可能編寫“ new Foo(“ Alligator”)“,這在最佳情況下會產生運行時錯誤。

您實際上是否應該為Young,Adult和Old創建三個類,並且它們都可以實現一個公共接口或擴展一個抽象類以將它們聯系在一起?

在父抽象類中創建一個靜態工廠方法,該方法創建了所需子類的對象並將其返回? 你為什么不想上三堂課? 它們將從父類的引用類型中引用,因此它們將“看起來”像同一類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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