Используя момент инерции в науке

Я использую jscience в простом физическом калькуляторе, который я делаю. Мне нужно рассчитать момент инерты с учетом некоторых передач и вращающихся цилиндров.

Я предпочитаю использовать jscience, но, похоже, у jscience нет меры момента инерции? Или момент инерции представлен как что-то еще? Из этих формул я понимаю, что момент инерции можно описать с помощью кг * м ^2.

Глядя на другие количественные интерфейсы в jscience, я попытался имитировать "массовый" интерфейс и создал свой собственный количественный интерфейс с именем "MomentOfInertia":

package jscience;

import javax.measure.quantity.Quantity;
import javax.measure.unit.Unit;

public interface MomentOfInertia extends Quantity {

    public final static Unit<MomentOfInertia> UNIT = 
        SI.KILOGRAM.times(SI.SQUARE_METRE).asType(MomentOfInertia.class);

}

Далее я пытаюсь определить момент инерции:

public static void main(String[] args) throws Exception {
    Amount<MomentOfInertia> moi = Amount.valueOf(1000,
        SI.KILOGRAM.times(SI.SQUARE_METRE).asType(MomentOfInertia.class));

    System.out.println(moi);
}

Тем не менее, это не будет работать без следующего исключения:

Exception in thread "main" java.lang.ExceptionInInitializerError
at sun.misc.Unsafe.ensureClassInitialized(Native Method)
    at sun.reflect.UnsafeFieldAccessorFactory.newFieldAccessor(UnsafeFieldAccessorFactory.java:43)
    at sun.reflect.ReflectionFactory.newFieldAccessor(ReflectionFactory.java:142)
    at java.lang.reflect.Field.acquireFieldAccessor(Field.java:1088)
    at java.lang.reflect.Field.getFieldAccessor(Field.java:1069)
    at java.lang.reflect.Field.get(Field.java:393)
    at javax.measure.unit.Unit.asType(Unit.java:170)
    at test.Test.main(Test.java:8)
Caused by: java.lang.NullPointerException
    at javax.measure.unit.Unit.asType(Unit.java:174)
    at jscience.MomentOfInertia.<clinit>(MomentOfInertia.java:10)
    ... 8 more

TLDR: (Как) я могу определить момент инерции в науке?

1 ответ

Решение

Я незнаком с JScience, но посмотрите на способ Torque определено:

public interface Torque extends Quantity {
    public final static Unit<Torque> UNIT = 
        new ProductUnit<Torque>(SI.NEWTON.times(SI.METRE));
}

Проблема, с которой вы столкнулись, заключается в циклической инициализации: вы звоните asType чтобы получить значение, которое вы назначите MomentOfInertia.UNIT, но asType(MomentOfInertia.class) требует значения MomentOfInertia.UNIT, который в настоящее время является нулевым, потому что он не был назначен.

Итак, что-то вроде следующего может работать:

public interface MomentOfInertia extends Quantity {

    public final static Unit<MomentOfInertia> UNIT = 
        new ProductUnit<MomentOfInertia>(SI.KILOGRAM.times(SI.SQUARE_METRE));

}
Другие вопросы по тегам