Как создать пустую строку? - PullRequest
1 голос
/ 17 августа 2010

У меня есть два конструктора

MyObj(String s){ //first constructor
    ...
    if(s==null) s = somecode;
            this.s = s;
    ...
}

MyObj(): this(null) { } //second constructor

Таким образом, если вызывается пустой конструктор, он будет перенаправлен на первый конструктор и инициализирует значение, определенное некоторым кодом.

Однако теперь у меня есть третий конструктор

MyObj(Stream st){ //third constructor
    ...
}

Теперь второй конструктор не знает, должен ли он вызывать первый конструктор или третий. Как мне сказать, чтобы вызвать первый конструктор? Я пробовал MyObj(): this(String s = null), и это тоже не работает.

Ответы [ 5 ]

10 голосов
/ 17 августа 2010

Может быть: MyObj(): this((string) null) {}?

1 голос
/ 17 августа 2010

Я согласен с осадой. Не пытайтесь связать конструкторы, вместо этого используйте функцию Init, которую можно вызывать по мере необходимости из каждого ctor.

1 голос
/ 17 августа 2010

Мне часто легче защитить свою вменяемость, используя метод инициализации для классов с несколькими конструкторами.Единственный

private void Init(string str, Stream stream, bool doOtherStuff)
{
    // do stuff, replace nulls with defaults, etc
}

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

0 голосов
/ 23 ноября 2018

Я думаю, что будет лучше следующий кусок кода.

MyObj(String s) //first constructor
{ 
    ...      
    this.s = s;
    ...
}

MyObj() //second constructor
{
    this(somecode);
} 

MyObj(Stream st) //third constructor
{ 
   ...
}

Мой пример показывает, что вы можете избежать проверки на null в первом конструкторе. Использование второго конструктора в случае, если строка s из первого конструктора имеет значение null, улучшает читабельность вашего кода

0 голосов
/ 17 августа 2010

Добавление моего бита.

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

Это будет более явно для пользователя вашего классапри этом пользователь может вызвать интересующий его метод создания и передать только соответствующие параметры.И не беспокойтесь о том, что еще есть в объекте.

...