Я не знаю, какой именно ваш вариант использования здесь, но я не думаю, что вы можете делать то, что хотите, с @Deprecated. Когда вы помечаете что-то как устаревшее, вы помечаете поле, метод или класс НЕ значением. Все, к чему вы получаете доступ в loadProperty, это значение.
Итак, взяв ваш пример, я могу довольно легко позвонить
new MyRepo().loadProperty("old_path");
без ссылки на OLD_PATH или NEW_PATH вообще. Решение простое, вам нужно явно проверить в ваших методах соответствие. (добавлен метод isDeprecated). Вы можете оставить аннотацию @Deprecated, если хотите, в качестве указания.
public class MyRepo {
@Deprecated
private static final String OLD_PATH = "old_path";
private static final String NEW_PATH = "new_path";
private boolean isDeprecated(String path) {
return OLD_PATH.equals("old_path");
}
//...
public load(Node node){
migrateProperty(node, OLD_PATH , NEW_PATH );
//load the properties
loadProperty(node, NEW_PATH);
}
//I want to validate that the String oldPath has the @Deprecated annotation
public void migrateProperty(Node node, String oldPath, String newPath) {
if (!isDeprecated(oldPath)) {
throw new Exception(oldPath + " is not deprecated");
}
if(node.hasProperty(oldPath)){
Property property = node.getProperty(oldPath);
node.setProperty(newPath, (Value) property);
property.remove();
}
}
//I want to validate that the String path does not have the @Deprecated annotation
public void loadProperty(Node node, String path) {
if (isDeprecated(path)) {
throw new Exception(path + " is deprecated, please use " + NEW_PATH);
}
//load the property from the node
}
}
Если этот шаблон необходимо применить к нескольким классам, вы, конечно, можете сделать его более строгим.