c# класс должен генерировать экземпляры себя?

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

См. также: A хороший список лучших практик

Я бы добавил, очень важно, хорошо использовать модификатор final. Использование "окончательной" модификатор, когда это применимо в Java

Сводка:

  1. Используйте модификатор final для обеспечения хорошей инициализации.
  2. Избегайте возврата null в методы, например, при возврате пустых коллекций.
  3. Использовать аннотации @NotNull и @Nullable
  4. Быстрое завершение работы и использование утверждений, чтобы избежать распространения нулевых объектов через все приложение, когда они не должен быть пустым.
  5. Сначала используйте значения с известным объектом: if("knownObject".equals(unknownObject)
  6. Предпочитают valueOf() поверх toString ().
  7. Используйте null safe StringUtils StringUtils.isEmpty(null).

13
задан ROMANIA_engineer 14 January 2018 в 18:44
поделиться

12 ответов

Это прекрасно подходит для получения собственного объекта (объектов) от статического метода.

, например,

Одна из точечных сетевых библиотек делает то же самое, как Вы сделали,

XmlReadrer reader = XmlReader.Create(filepathString);
20
ответ дан 1 December 2019 в 19:15
поделиться

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

5
ответ дан 1 December 2019 в 19:15
поделиться

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

3
ответ дан 1 December 2019 в 19:15
поделиться

Кажется прекрасным мне. На других языках Вы, вероятно, записали бы функцию, но на языке как C#, статические методы поднимают ту роль.

2
ответ дан 1 December 2019 в 19:15
поделиться

Это в порядке. То, что Вы просто создали, является чем-то как простой метод фабрики. У Вас есть статический метод, который создает допустимый экземпляр типа. На самом деле Ваш метод не должен даже быть статическим, и у Вас все еще есть действительный код. Существует шаблон разработки (Прототип), который создает новый доступный объект из существующего объекта. Посмотрите детали в http://www.dofactory.com/Patterns/PatternPrototype.aspx .

1
ответ дан 1 December 2019 в 19:15
поделиться

Несомненно, для простого парсинга (или подобный) сценарии - я на самом деле предпочитаю , метод фабрики является частью класса. Да - это действительно повреждается SRP, но это выполняет KISS - таким образом, я называю это сетевой победой. Для объемных приложений или более сложных стандартных программ парсинга - имеет больше смысла иметь его быть внешним классом фабрики.

Для Вашего особого случая, я, вероятно, предпочел бы метод, который взял в IEnumerable< string> вместо имени файла - это все еще дало бы Вам логику синтаксического анализа, но позволило бы легкие модульные тесты и "повторное использование". Вызывающая сторона может перенести файл в IEnumerable достаточно легко.

1
ответ дан 1 December 2019 в 19:15
поделиться

Я - поклонник наличия экземпляров возврата статических методов, как предложено много времен, выше.

@Paul: не забывайте отмечать комментарий выше, который Вы находите, лучший ответ.

1
ответ дан 1 December 2019 в 19:15
поделиться

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

Это не от конструктора, это от статического метода.

1
ответ дан 1 December 2019 в 19:15
поделиться

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

Особенно в ситуациях, где не хорошо полагаться на одни только типы параметра для указания, какая объектная конструкция предназначается.

1
ответ дан 1 December 2019 в 19:15
поделиться

Методы фабрики часто являются хорошим дизайном. Когда я пишу им в C#, я называю их 'Новыми', так, чтобы:

new MyClass()

становится

MyClass.New()

Тривиально, это реализовано как это:

class MyClass
{
    public static MyClass New()
    {
        return new MyClass();
    }
}

Главным образом я делаю это, когда существуют дополнительные условия о том, создать ли на самом деле класс или просто возвратиться null, или возвратиться ли MyClass, или что-то произошло из него.

1
ответ дан 1 December 2019 в 19:15
поделиться

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

    public class Car
    {
        public static Car RedExpensiveCar = new Car("Red", 250000);

        public Car()
        {

        }

        public Car(string color, int price)
        {
            Color = color;
            Price = price;
        }

        public string Color { get; set; }
        public int Price { get; set; }
    }

И с этим, я не должен помнить или записать параметры конструктора в своем коде.

Car car = Car.RedExpensiveCar;
1
ответ дан 1 December 2019 в 19:15
поделиться

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

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

0
ответ дан 1 December 2019 в 19:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: