О совместимости написанного общедоступного API java Runtime - PullRequest
1 голос
/ 22 сентября 2011

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

Есть 4 простых класса, дочерний класс расширяет Parent. PubAPI - это класс, который предоставляет публичный метод для использования cient. Клиентский класс вызывает публичные методы 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 теперь находятся в versoin 2, если мы не перекомпилируем класс «Client» и не используем его файл сгенерированного класса версии 1. Это приведет к сбою во время выполнения Java с ошибкой не может найти метод версии 1 (потому что тип возвращаемого значения изменяется).

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

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

спасибо.

1 Ответ

2 голосов
/ 22 сентября 2011

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

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

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

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

...