2015-01-26 4 views
-3

Я не совсем уверен, что имя вещи, которую я описываю, называется конструктором? Однако то, что я хочу сделать, - это увидеть, какой конструктор используется для создания объекта.Java, как проверить, какой конструктор используется?

Class Classname{ 

    private int a, b, c; 

    public Classname(int a, int b){ 
    this.a = a; 
    this.b = b; 
    } 

    public Classname(int a, int b, int c){ 
    this.a = a; 
    this.b = b; 
    this.c = c; 
    } 
} 

И если мы создаем объект:

Classname testobject = new Classname(1, 2); 

Что мне нужно, что для это потому, что мне нужно, чтобы получить число varuables в объекте, и значения этих переменных. Скажем, я имею следующее:

classname[] multiple = new classname[10] 

То есть «имя класса» -Объекты от обоих конструкторах, и мне нужно, чтобы написать эти объекты в строки, так что я думаю, что я должен каким-то образом получить правильный конструктор, и если это первый один

public static String getStringform(Classname classname){ 
String stringform; 
if(constructor == 1) 
    stringform = String.valueOf(classname.a) +String.valueOf(classname.b); 
else 
    stringform = String.valueOf(classname.a) +String.valueOf(classname.b) +String.valueOf(classname.c); 
} 

Edit: Как указывается в комментариях, я сделал новые конструкторы, как это:

private int type; 
private int a, b; 

public Classname(int a, int b){ 
    this.type = 1; 
    this.a = a; 
    this.b = b; 
} 

, но даже с такой конструктор, когда я пытаюсь получить «тип» объекта, сделанного в другом классе, я не получаю нужный тип ..? Я получаю java.lang.NullPointerException при использовании followin:

public static String toString(Classname object){ 
if(object.type == 1) //<-- There's the exception 
+0

Извините за плохой английский, написал его по телефону, слишком медленно, чтобы редактировать, сделаю это позже :) – user3738243

ответ

1

Просто добавьте сообщение в печати каждого конструктора или использовать отладчик

1

Вы можете добавить «флаг» в своем классе (или использовать Integer и проверка c недействительности):

class Classname{ 

    private int constructor; // the flag 
    private int a, b, c; 

    private Classname(int a, int b){ 
    this.constructor = 1; 
    this.a = a; 
    this.b = b; 
    } 

    private Classname(int a, int b, int c){ 
    this.constructor = 2; 
    this.a = a; 
    this.b = b; 
    this.c = c; 
    } 
} 

Затем используйте этот флаг:

public static String getStringform(Classname classname){ 
    String stringform; 
    if(classname.constructor == 1) { 
     stringform = "" + classname.a + classname.b; 
    } else { 
     stringform = "" + classname.a +classname.b +classname.c; 
    } 
    return stringForm; 
} 

NB: Я добавил "", скобку и оператор возврата в getStringForm, но до сих пор может быть вопросов (доступ к закрытым членам, частным застройщикам, ...)

+0

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

+0

Я думаю, что как я отвечаю на вопрос, я добавил частных конструкторов в список потенциальных проблем, оставшихся. –

+0

Не могли бы вы объяснить, почему вы выбрали частный модификатор для конструкторов? –

0

Ответ прост, если есть нет конструктора, указанного в заданном классе, тогда используется конструктор по умолчанию, т. е. конструктор без таких аргументов, как этот private Classname(){...}, теперь у вас есть 2 конструктора, которые могут называть его C1 как private Classname(arg1, arg2){...} и C2 как private Classname(arg1, arg2, arg3){...}, поэтому, если вы создаете объект класса с целыми целыми целыми числами, будет использоваться, и, пройдя 3 целых числа C2, вызывается.

Запишите здесь, поскольку вы создали C1 и C2, поэтому конструктор по умолчанию больше не доступен этому классу. Если вы хотите использовать это, тоже создайте этот конструктор.

0

У вас может возникнуть проблема с моделированием.

я просто бы два различных класса, вот псевдо-код:

public class ClassWithTwoFields { 
    public final Object field1; 
    public final Object field2; 

    public ClassWithTwoFields(final Object f1, final Object f2) { 
    field1 = f1; 
    field2 = f2; 
    } 

    public String getStringform() { 
    return field1 + field2; 
    } 

}

public class ClassWithThreeFields extends ClassWithTwoFields { 
    public final Object field3; 

    public ClassWithThreeFields(final Object f1, final Object f2, final Object f3) { 
    super(f1, f2); 
    field3 = f3; 
    } 

    public String getStringform() { 
    return field1 + field2 + field3; 
    } 
} 
+0

Нет, конструктор для обоих должен быть таким же или я не могу сделать объект [] содержащий оба; два и три полевых объекта – user3738243

0

С текущего класса каждое из полей членов будет (перед конструктором запускается) инициализируется с помощью 0 (значение по умолчанию для поля int). Поэтому, если конструктор не инициализирует c, он будет равен нулю.

Теперь, это может быть допустимым значением для c, которые могут быть переданы в конструктор 3-аргумента, что делает набор c, поэтому вы не можете просто проверить, если c 0.

Вы могли бы решить эту проблему несколько путей. То, что имеет смысл, будет зависеть от того, что на самом деле означают поля. Но, по сути, это сводится к записи, было ли установлено c допустимое значение.

Это может быть столь же просто, как определяющий boolean поле, называемое cIsValid и установить его в true когда c установлен в конструкторе и false, если нет.