Как изменить параметры в предопределенном интерфейсе в JAVA?

76
5

Недавно я реализовал решение ODE из библиотеки Apache Commons. Я считаю, что это очень хорошо, я должен сказать, но у меня есть некоторые вопросы, которые частично связаны с интерфейсами JAVA и частично с самой панелью инструментов. Я надеюсь, что один из вас может помочь мне в этом. Я использую пример, показанный на главной странице.

Они начинают определять функцию ODE:

private static class CircleODE implements FirstOrderDifferentialEquations {

public double[] c;
public double omega;

public CircleODE(double[] c, double omega) {
this.c = c;
this.omega = omega;
}

public int getDimension() {
return 2;
}

public void computeDerivatives(double t, double[] y, double[] yDot) {
yDot[0] = omega * (c[1] - y[1]);
yDot[1] = omega * (y[0] - c[0]);
}

}

Затем они инициируют интегратор и модель:

FirstOrderIntegrator dp853 = new DormandPrince853Integrator(1.0e-8, 100.0, 1.0e-10, 1.0e-10);
FirstOrderDifferentialEquations ode = new CircleODE(new double[] { 1.0, 1.0 }, 0.1);

отсюда они имеют некоторое начальное значение и вычисляют от начального значения до некоторого конечного состояния:

double[] y = new double[] { 0.0, 1.0 }; // initial state

dp853.integrate(ode, 0.0, y, 16.0, y); // now y contains final state at time t=16.0

Мой вопрос: теперь предположим, что я хочу изменить значение омеги, скажем, от t = 16 до t = 23. Как бы я мог обойти это?

Мои предложения (которые не работают):

Предложение 1: Я думал о выполнении переменной static:

public static double omega;

но мое намерение - запустить многопоточность в какой-то момент, поэтому установка omega в static показала, что это плохая идея.

Предложение 2: Затем я подумал о создании нового interface который мог бы включать методы setter и getter в CircleODE, тем самым позволяя мне изменять значение omega на ходу.

public interface Circle{
public void setOmega(double myNewValueOfOmega);

}

Вызов CircleODE стал бы:

private static class CircleODE implements FirstOrderDifferentialEquations, Circle 

Я подумал: "Это довольно хорошая идея, все, что мне нужно сделать, это вызвать метод set следующим образом:

ode.setOmega(newValueOfOmega);

Это не возможно, так как ode на самом деле является экземпляром FirstOrderDifferentialEquations (я думаю), и, следовательно, мой новый метод setOmega нельзя назвать.

Есть ли у вас какие-либо предложения о том, как я могу изменить ценность Omega, не создавая новый экземпляр ode?

спросил(а) 2020-04-04T00:34:55+03:00 3 месяца назад
1
Решение
101

Вы можете вернуть его в CircleODE только для установки Omega и вызвать метод setOmega без создания нового экземпляра.

FirstOrderIntegrator dp853 = new DormandPrince853Integrator(1.0e-8, 100.0, 1.0e-10, 1.0e-10);
FirstOrderDifferentialEquations ode = new CircleODE(new double[] { 1.0, 1.0 }, 0.1);

((CircleODE)ode).setOmega(newValueOfOmega);

Для остальной части кода ode останется экземпляром FirstOrderDifferentialEquations.

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

ответил(а) 2020-04-04T00:47:05.912607+03:00 3 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема