О совместимости общедоступного API среды выполнения Java

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

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

public class Parent
{
}

public class Child extends Parent
{
}


public class PubAPI
{
public Parent getChild(){
    return new Child();
}
}


public class Client
{
public static void main(String[] args)
{
    System.out.println(new PubAPI().getChild());
}
}

Первые 3 класса предоставляются производителем API, допустим, указанная выше версия — это версия 1.

в версии 2 класс PubAPI изменен, чтобы возвращать дочерний тип:

public class PubAPI
{
public Child getChild(){
    return new Child();
}
}

класс поставщика 3 API теперь находится в версии 2, в то время как если мы не перекомпилируем класс «Клиент» и не будем использовать сгенерированный файл класса версии 1. ИТ-специалист потерпит неудачу во время выполнения Java с ошибкой, не может найти метод версии 1 (поскольку тип возвращаемого значения изменяется).

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

В общем, каково общедоступное правило совместимости уровня байт-кода API/класса для классов API, используемых другими.

Благодарю.


person Ben Xu    schedule 22.09.2011    source источник
comment
Настройте свой редактор на использование пробелов вместо табуляции, чтобы отступ отображался здесь правильно.   -  person Miserable Variable    schedule 22.09.2011
comment
возможный дубликат Рефакторинг методов и двоичная совместимость в Java   -  person Miserable Variable    schedule 22.09.2011


Ответы (1)


РЕДАКТИРОВАТЬ: две недели назад вы задали почти тот же вопрос и приняли ответ. Мне интересно, что побудило вас спросить еще раз, вы же не думали, что правила изменятся за две недели, не так ли?

Вы находитесь на правильном пути с ключевым словом совместимость на уровне байт-кода. Это называется бинарная совместимость, которую вы можете найти в сети. Например, здесь

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

Этот вопрос, похоже, обсуждает точно такую ​​же проблему. документ на сайте eclipse легче читать, чем JLS.

person Miserable Variable    schedule 22.09.2011