Для запуска javascript можно использовать внешнюю библиотеку, такую как RHINO или NASHORN. И javascript может оценивать простую формулу без парсинга строки. Не влияет на производительность, если код написан хорошо. Ниже приведен пример с RHINO -
public class RhinoApp {
private String simpleAdd = "(12+13+2-2)*2+(12+13+2-2)*2";
public void runJavaScript() {
Context jsCx = Context.enter();
Context.getCurrentContext().setOptimizationLevel(-1);
ScriptableObject scope = jsCx.initStandardObjects();
Object result = jsCx.evaluateString(scope, simpleAdd , "formula", 0, null);
Context.exit();
System.out.println(result);
}
Это зависит от пространства имен, в котором вы уже находитесь:
Если вы не находитесь в пространстве имен или в другом несвязанном пространстве имен, тогда вы должны указать весь путь ABC :: XYZ :: ClassA
.
Если вы находитесь в ABC
, вы можете пропустить ABC
и просто написать XYZ :: ClassA
.
Также стоит упомянуть, что если вы хотите обратиться к функции, которая не находится в пространстве имен (или «корневом» пространстве имен), вы можете добавить к ней префикс ::
:
Пример:
int foo() { return 1; }
namespace ABC
{
double foo() { return 2.0; }
void bar()
{
foo(); //calls the double version
::foo(); //calls the int version
}
}
Если myobject
объявлен в этом пространстве имен, и вы хотите объявить это снова (для определения), вы делаете это, добавляя префикс его имени, а не его типа.
ClassA ABC::XYZ::myobject;
Если его тип также объявлен в этом пространстве имен, вам также необходимо добавить префикс к имени типа
ABC::XYZ::ClassA ABC::XYZ::myobject;
Редко нужно повторно объявлять такой объект. Часто первое объявление объекта также является его определением. Если вы хотите сначала объявить объект, вы должны сделать это в этом пространстве имен. Следующее объявляет и определяет «myobject»
namespace ABC {
namespace XYZ {
ClassA myobject;
}
}
. Если вы определили в объекте, подобном этому, вы обращаетесь к нему, говоря ABC :: XYZ
. Вам не нужно каким-то образом «объявлять» этот объект, чтобы использовать его локально
void f() {
ABC::XYZ::myobject = someValue;
// you *can* however use a using-declaration
using ABC::XYZ::myobject;
myobject = someValue;
}