Да, вроде... #8>P
Бит "Закрыто для изменений" говорит, что вы не должны ни удалять подпись public void method1()
, ни изменять ее семантику (должна быть предоставлена всеми правильно реализующими конкретные классы).
Бит "Открыть для расширения" позволяет (осторожно) изменять интерфейс, пока предыдущие элементы интерфейса остаются как есть (структурно и семантически). Вы можете попробовать что-то вроде этого:
public class SomeClass {
@Deprecated
default public void method1(){
method1(#SENTINAL#);
}
public void method1(#TYPE# arg){
if (arg == #SENTINAL#) {
// do something old
} else {
// do something new
}
}
public void method2(){
// do something
}
}
ПРИМЕЧАНИЕ. Этот подход может не работать, если аргумент не имеет полезного значения #SENTINAL#, например. это int
и все значения допустимы. Однако часто есть что-то, например, любое отрицательное значение, значение MIN или MAX, пустой или нулевой объект и т. д. Когда такой контрольный параметр недоступен, вы можете создать частный общий метод, например:
public class SomeClass {
@Deprecated
default public void method1(){
method1(true);
}
public void method1(#TYPE# arg){
method1(false, arg)
}
private void method1(boolean isOldWay, #TYPE# arg) {
if(isOldWay) {
// snore - still old clients
} else {
// yea! new clients are much greener!
}
}
}
PS - я говорю "интерфейс", хотя вы используете класс. Просто подумайте об интерфейсе как об общедоступных элементах класса, объявленных одновременно с реализацией класса. Обычно я предпочитаю код для интерфейсов, но это не вопрос ОП, и это не изменит мою точку зрения (просто где были сделаны модификации - особенно при использовании реализаций интерфейса Java 8 по умолчанию).
person
Stevel
schedule
03.04.2016
method1()
, потому что ни один из этих вызовов с 0 аргументами больше недействителен. Я бы не стал так беспокоиться об OCP, как о простой обратной совместимости. Конечно, если вы контролируете весь вызывающий код, это нормально. Это действительно зависит от контекста. - person Jon Skeet   schedule 03.04.2016