Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException
вообще.
См. также: A хороший список лучших практик
Я бы добавил, очень важно, хорошо использовать модификатор final
. Использование "окончательной" модификатор, когда это применимо в Java
Сводка:
final
для обеспечения хорошей инициализации. @NotNull
и @Nullable
if("knownObject".equals(unknownObject)
valueOf()
поверх toString (). StringUtils
StringUtils.isEmpty(null)
. Давайте объясним стратегическую модель простой способ:
у Вас есть класс Car()
с методом run()
, таким образом, Вы используете его этот путь на псевдо языке:
mycar = new Car()
mycar.run()
Теперь, можно хотеть измениться run()
поведение на лету, в то время как программа выполняется. Например, Вы могли бы хотеть моделировать моторный отказ или использование кнопки "повышения" в видеоигре.
существует несколько способов сделать это моделирование: использование условных операторов и переменной флага является одним путем. Стратегическая модель - другой: это делегирует поведение run()
метод к другому классу:
Class Car()
{
this.motor = new Motor(this)
// passing "this" is important for the motor so it knows what it is running
method run()
{
this.motor.run()
}
method changeMotor(motor)
{
this.motor = motor
}
}
, Если Вы хотите изменить поведение автомобиля, можно просто изменить двигатель. (Легче в программе, чем в реальной жизни, правильно?;-))
очень полезно, если у Вас есть много сложных состояний: можно изменить и поддержать их намного более легко.
стратегическая модель используется для решения проблем, которые могли бы (или предсказываться, они могли бы) быть реализованным или решенным различным стратегии и которые обладают ясно определенным интерфейсом для таких случаев. Каждая стратегия совершенно действительна самостоятельно с некоторыми стратегиями, являющимися предпочтительным в определенных ситуациях, которые позволяют приложению переключаться между ними во время времени выполнения.
namespace StrategyPatterns
{
// Interface definition for a Sort algorithm
public interface ISort
{
void Sort(List<string> list)
}
// QuickSort implementation
public class CQuickSorter : ISort
{
void Sort(List<string> list)
{
// Here will be the actual implementation
}
}
// BubbleSort implementation
public class CBubbleSort : ISort
{
void Sort(List<string> list)
{
// The actual implementation of the sort
}
}
// MergeSort implementation
public class CMergeSort : ISort
{
void Sort(List<string> list)
{
// Again the real implementation comes here
}
}
public class Context
{
private ISort sorter;
public Context(ISort sorter)
{
// We pass to the context the strategy to use
this.sorter = sorter;
}
public ISort Sorter
{
get{return sorter;)
}
}
public class MainClass
{
static void Main()
{
List<string> myList = new List<string>();
myList.Add("Hello world");
myList.Add("Another item");
myList.Add("Item item");
Context cn = new Context(new CQuickSorter());
// Sort using the QuickSort strategy
cn.Sorter.Sort(myList);
myList.Add("This one goes for the mergesort");
cn = new Context(new CMergeSort());
// Sort using the merge sort strategy
cn.Sorter.Sort(myList);
}
}
}
Тесно связанный шаблон является шаблоном Делегата; в обоих случаях часть работы передается некоторому другому компоненту. Если я понимаю правильно, различие между этими шаблонами - это (и исправьте меня, если я неправ):
В Делегат шаблон, делегат инстанцирует включение (делегирование) класс; это допускает повторное использование кода составом, а не наследованием. Класс включения может знать о конкретном типе делегата, например, если это вызывает своего конструктора само (в противоположность использованию фабрики).
В шаблон Стратегии , компонент, который осуществляет стратегию, является зависимостью, предоставленной включению с помощью компонента через его конструктора или метод set (согласно религии). Компонент использования полностью не знает о том, какая стратегия используется; стратегия всегда вызывается через интерфейс.
Кто-либо знает какие-либо другие различия?
Непосредственно от статья Strategy Pattern Wikipedia:
стратегическая модель полезна для ситуаций, где необходимо динамично подкачать алгоритмы, используемые в приложении. Стратегическая модель предназначается для обеспечения средства определить семейство алгоритмов, инкапсулировать каждого как объект и сделать их взаимозаменяемыми. Стратегическая модель позволяет алгоритмам варьироваться независимо от клиентов, которые используют их.
Уже добавить к magnificient ответы: стратегическая модель имеет сильное сходство с передачей функции (или функций) к другой функции. В стратегии это сделано путем обертывания, сказала функция в объекте, сопровождаемом путем передачи объекта. Некоторые языки могут передать функции непосредственно, таким образом, им не нужен шаблон вообще. Но другие языки не могут передать функции, но может объекты передачи; шаблон тогда применяется.
Особенно на подобных Java языках, Вы найдете, что зоопарк типа языка является довольно небольшим и что Ваш единственный способ расширить его путем создания объектов. Следовательно большинство решений проблем состоит в том, чтобы придумать шаблон; способ составить объекты достигнуть определенной цели. Языки с более богатыми зоопарками типа часто имеют более простые способы идти о проблемах - но более богатые типы также означают, что необходимо провести больше времени, изучая систему типов. Языки с дисциплиной динамического контроля типов часто получают подлый путь вокруг проблемы также.