Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException
вообще.
См. также: A хороший список лучших практик
Я бы добавил, очень важно, хорошо использовать модификатор final
. Использование "окончательной" модификатор, когда это применимо в Java
Сводка:
final
для обеспечения хорошей инициализации. @NotNull
и @Nullable
if("knownObject".equals(unknownObject)
valueOf()
поверх toString (). StringUtils
StringUtils.isEmpty(null)
. Это прекрасно подходит для получения собственного объекта (объектов) от статического метода.
, например,
Одна из точечных сетевых библиотек делает то же самое, как Вы сделали,
XmlReadrer reader = XmlReader.Create(filepathString);
Уверенный это прекрасно, даже поощренное в некоторых случаях. Существуют несколько шаблоны разработки, которые имеют дело с созданием объекта , и несколько из них делают, что Вы описываете.
Я часто использую этот шаблон, когда я должен проверить законность параметров. Этому сильно препятствуют для выдачи исключения от конструктора. Это не настолько плохо от метода фабрики, или можно принять решение возвратить пустой указатель.
Кажется прекрасным мне. На других языках Вы, вероятно, записали бы функцию, но на языке как C#, статические методы поднимают ту роль.
Это в порядке. То, что Вы просто создали, является чем-то как простой метод фабрики. У Вас есть статический метод, который создает допустимый экземпляр типа. На самом деле Ваш метод не должен даже быть статическим, и у Вас все еще есть действительный код. Существует шаблон разработки (Прототип), который создает новый доступный объект из существующего объекта. Посмотрите детали в http://www.dofactory.com/Patterns/PatternPrototype.aspx .
Несомненно, для простого парсинга (или подобный) сценарии - я на самом деле предпочитаю , метод фабрики является частью класса. Да - это действительно повреждается SRP, но это выполняет KISS - таким образом, я называю это сетевой победой. Для объемных приложений или более сложных стандартных программ парсинга - имеет больше смысла иметь его быть внешним классом фабрики.
Для Вашего особого случая, я, вероятно, предпочел бы метод, который взял в IEnumerable< string> вместо имени файла - это все еще дало бы Вам логику синтаксического анализа, но позволило бы легкие модульные тесты и "повторное использование". Вызывающая сторона может перенести файл в IEnumerable достаточно легко.
Я - поклонник наличия экземпляров возврата статических методов, как предложено много времен, выше.
@Paul: не забывайте отмечать комментарий выше, который Вы находите, лучший ответ.
Точно так же, как для указания "генерируют новые экземпляры себя путем вызова одного из его собственных конструкторов",
Это не от конструктора, это от статического метода.
Я иногда использую общедоступные статические методы в качестве альтернативы конструктору, перегружающемуся.
Особенно в ситуациях, где не хорошо полагаться на одни только типы параметра для указания, какая объектная конструкция предназначается.
Методы фабрики часто являются хорошим дизайном. Когда я пишу им в C#, я называю их 'Новыми', так, чтобы:
new MyClass()
становится
MyClass.New()
Тривиально, это реализовано как это:
class MyClass
{
public static MyClass New()
{
return new MyClass();
}
}
Главным образом я делаю это, когда существуют дополнительные условия о том, создать ли на самом деле класс или просто возвратиться null
, или возвратиться ли MyClass
, или что-то произошло из него.
Я обычно использую это, когда мне нужны мгновенные реализации класса. Например
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;
Совершенно приемлемо сделать это. Когда я делаю, я обычно делаю настоящих конструкторов для класса частными так, чтобы было ясно, что только способ создать экземпляры через статический метод.
Это очень полезно в случаях, куда "конструкция" не может всегда возвращать новый экземпляр. Например, можно хотеть возвратить ранее кэшируемый объект вместо этого.