2015-07-28 3 views
0

В Java, возможно ли иметь два конструктора одного класса с разными именами? Например, предположим, что у меня есть класс Test, я хотел бы иметь что-то вроде этогоКонструктор с именем, отличным от имени класса

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

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

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

Edit: Я собираюсь объяснить, почему я хотел бы это.

У меня есть класс, как это, давайте называть его 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, но в этом классе не нужны все HashMaps из ClassContainer, я хотите сэкономить место. Например, Class2 расширяет Class1, но ему нужно только hm2; Class3 расширяет Class1, но ему нужны только hm2 и hm3.

Мне нужен способ инициализировать только необходимые части ClassContainer для сохранения памяти. И я хочу использовать подклассы, потому что они имеют много кода.

+2

No. Это не возможно. –

+0

Может быть полезно, если вы объясните, что именно вы пытаетесь достичь, что делает конструкторы с разными именами желательным решением. Что вы пытаетесь сделать с вашим кодом? – Bobulous

+0

Хорошо, я отредактировал исходное сообщение с дополнительными пояснениями. – multigraph

ответ

1

Если у вас есть несколько конструкторов, я рекомендую вместо этого использовать класс Factory. Здесь вы можете добавить несколько статических функций, возвращающих новый экземпляр этого класса.

Это всегда рекомендуется при использовании нескольких конструкторов, потому что вы можете дать методам любое имя, которое вы хотите.

3

Нет, конструктор должен иметь одно и то же имя класса. Самое близкое, что вы можете сделать, это наследование:

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<>(); 
    } 
} 
1

Нет, это не так. Конструкторы должны иметь то же имя, что и класс, и ничего не должны возвращать. Однако их подписи могут меняться в количествах и типах аргументов. Вы могли бы сделать, например, следующее: (. Подкласс Test под названием Test2, который имеет hsD)

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

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

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

Тем не менее, кажется, что вы хотите иметь наследство

0

невозможно объявить два конструктора с разные имена. Тем не менее, вы можете иметь два конструктора с различными параметрами:

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

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

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

В приведенном выше примере, exampleArg фиктивный аргумент, который просто означает различать два конструктора.

0

Вы не можете.

Что вы можете сделать, это предоставить вместо этого статические методы построения (которые могут иметь любые имена). Вы будете в конечном итоге с несколькими конструкторами, но вы можете сделать их частными и только разоблачить статические строители:

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(); 

Я также взял на себя смелость исправить пару опечаток в вашем коде: карта принимает два общих аргумента, всегда лучше определить ссылку как наиболее абстрактный тип (используйте Map и Set вместо HashMap/HashSet при объявлении ссылочных типов).

0

Вы должны использовать наследование. Если вы хотите быть разборчивыми, используйте завод.

Привет,

Хавьер Б.

Смежные вопросы