Это вопрос для Java. У меня есть интерфейс, который называется IMyObjectPredicate
, который реализует один метод испытаний для применения к входу:Прохождение анонимных классов
public interface IMyObjectPredicate {
boolean test(MyObject x);
}
То, что я хотел бы, чтобы быть в состоянии передать экземпляр IMyObjectPredicate
вокруг между объектами и имеет функцию test
обновить свои ссылки к переменным к переменным нового объекта, к которому он передается. Например, рассмотрим класс, который делает использование этого предиката:
public class Tester {
MyObject o;
IMyObjectPredicate myTestFunction;
int myThreshold;
public Tester(/*stuff*/) {
/*Code here which initialises the Tester instance and 'myThreshold'*/
myTestFunction = new IMyObjectPredicate() {
@Override
public boolean test(MyObject o) {
return (o.value() > myThreshold);
}
};
}
pubic boolean isGood() {
return myTestFunction.test(o);
}
}
Я хотел бы быть в состоянии выполнить глубокий клон объекта Tester по причинам, я не буду вдаваться в здесь. Но идея состоит в том, что клонированный экземпляр Tester
должен проверить предикат на его собственный значение myThreshold
, а не ссылку myThreshold
первого экземпляра. Но если я передам myTestFunction
в новый экземпляр Tester
, я думаю, он все равно будет ссылаться на значение myThreshold
первого экземпляра вместо динамической оценки myThreshold
на основе ссылки окружающего класса.
Как я могу выполнить прохождение объекта IMyObjectPredicate
, чья тестовая функция использует ссылки на поля нового объекта , он передан в?
Edit: осложняющим фактором является то, что, в общем, это не будет возможно восстановить myTestFunction
исключительно из полей в пределах Tester
объекта. myTestFunction
может быть перезаписан другими частями программы таким образом, который не коррелирует с другими полями Tester
. Я могу пожертвовать этой функциональностью, если понадобится, но я бы предпочел не ради элегантности.
Я бы не ожидал, что это станет возможным.Но если это в конструкторе, вы можете просто создать новый предикат. –
@LouisWasserman В общем, 'myTestFunction' будет изменен в ходе программы. Я хочу иметь возможность копировать его по требованию по мере необходимости. – Myridium
У вашего анонимного метода 'IMyObjectPredicate' есть метод no-arg' test() ', но интерфейс требует, чтобы он принял аргумент' MyObject' ...? –