簡體   English   中英

名稱與類名不同的構造方法

[英]Constructor with name different to the class name

在Java中,是否可能具有相同名稱的兩個相同類的構造函數? 例如,假設我有Test類,我想擁有這樣的東西

class Test
    HashMap<Integer,Double> hsI;
    HashMap<Double,Double> hsD;

    Test() {
        hsi = new HashMap<>();
    }

    Test2() {
        hsi = new HashMap<>();
        hsD = new HashMap<>();
    }
}

編輯:我將解釋為什么我想要這個。

我有一個這樣的課程,我們稱之為Class1

public class Class1 {
private HashMap<Integer,ClassContainer> hm;

private class ClassContainer {

    ClassContainer {
    hm1 = new HashMap<>();
    hm2 = new HashMap<>();
    hm3 = new HashMap<>();
    }

    HashMap<Double,Double> hm1;
    HashMap<Double,Double> hm2;
    HashMap<Double,Double> hm3;

... //more code
    }

所以我想做一些Class1子類,但是在這些類中,我不需要ClassContainer所有哈希圖,我想節省空間。 例如,Class2將擴展Class1,但只需要hm2; Class3將擴展Class1,但只需要hm2和hm3。

我想要一種初始化ClassContainer的必要部分以節省內存的方法。 我想使用子類,因為它們共享許多代碼。

否,構造函數必須具有相同的類名。 您可以做的最接近的事情是繼承:

class Test {
   HashMap<Integer, MyObject> hsI; // a map has two type arguments

   Test() {
      hsi = new HashMap<>();
   }
}

class Test2 extends Test {
   HashMap<Double, MyObject> hsD;

   Test2() {
      super();
      hsD = new HashMap<>();
   }
}

不它不是。 構造函數必須與該類具有相同的名稱,並且不得返回任何內容。 但是,它們的簽名可以更改參數的數量和類型。 您可以執行以下操作:

class Test {
    HashMap<Integer> hsI;
    HashMap<Double> hsD;

    Test() {
       hsi = new HashMap<>();
    }

    Test(int i) {
        hsi = new HashMap<>();
        hsD = new HashMap<>();
    }
}

但是,似乎您想要繼承( Test名為Test2的子類,它具有hsD

如果您有多個構造函數,我建議改用Factory類。 在這里,您可以添加多個靜態函數,這些函數將返回此類的新實例。

在使用多個構造函數時,始終建議這樣做,因為您可以為方法指定任何名稱。

不能聲明兩個具有不同名稱的構造函數。 但是,可以有兩個帶有不同參數的構造函數:

class Test 
HashMap<Integer> hsI;
HashMap<Double> hsD;

    Test() {
       hsi = new HashMap<>();
    }

    Test2(String exampleArg) {
        hsi = new HashMap<>();
        hsD = new HashMap<>();
    }
}

在上面的示例中, exampleArg是一個偽參數,僅用於區分兩個構造函數。

你不能

您可以做的是改為提供靜態生成器方法(可以使用任何名稱)。 您將獲得多個構造函數,但可以將它們設為私有,並且僅公開靜態構造器:

class Test {
    private final Set<Integer> ints;
    private final Set<Double> doubles;

    private Test(Set<Integer> ints) {
        this(ints, null);
    }
    private Test(Set<Integer> ints, Set<Double> doubles) {
        this.ints = ints;
        this.doubles = doubles;
    }

    public static Test test1() {
        return new Test(new HashSet<Integer>());
    }
    public static Test test2() {
        return new Test(new HashSet<Integer>(), new HashSet<Double>());
    }
}

然后,您可以像這樣使用:

Test test1 = Test.test1();
Test test2 = Test.test2();

我還自由地修復了代碼中的幾個拼寫錯誤:映射有兩個通用參數,將引用定義為最抽象的類型總是更好(在聲明引用類型時使用MapSet而不是HashMap / HashSet )。

您應該使用繼承。 如果要挑剔,請使用工廠。

問候,

哈維爾·B。

暫無
暫無

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

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