سؤال

عندما تقوم بالتحويل بين كيانين ، عادة ما تقوم بذلك عبر محول وحدات. كيف يمكنني معرفة ما هو عامل التحويل؟ علي سبيل المثال:

public static final Unit<Length> KILOMETRE = METER.times(1000);
public static final Unit<Length> CENTIMETRE = METRE.divide(100);

أرغب في الحصول على عامل التحويل برمجيًا من واجهات المحول (أي 1000 برميل/ث كيلومتر ومتر أو 1/100 في حالة سنتيمتر إلى متر)

لست متأكدًا من كيفية إحضار هذه المعلومات من واجهة UnitConverter.

EDIT1

protected double getConvFactor(Unit<Length> from, Unit<Length> to) {
    double factor = -1;

    UnitConverter unitConverter = from.getConverterTo(to);

    if (unitConverter instanceof MultiplyConverter) {
        MultiplyConverter multiplyConverter = (MultiplyConverter) unitConverter;
        factor = multiplyConverter.getFactor();
    } else if (unitConverter instanceof AddConverter) {
        AddConverter addConverter = (AddConverter) unitConverter;
        factor = addConverter.getOffset();
    } else if (unitConverter instanceof RationalConverter) {
        RationalConverter rationalConverter = (RationalConverter) unitConverter;
        double divisor = rationalConverter.getDivisor().doubleValue();
        double dividend = rationalConverter.getDividend().doubleValue();
        factor = divisor;
    }
}
هل كانت مفيدة؟

المحلول

تحرير بعد مزيد من الرمز المنشور بواسطة OP:

UnitConverter هي فئة مجردة ، لذلك يجب على المرء أن يستمد منه لإنشاء محول للوحدات المحددة التي تفكر فيها.

إذا كنت تستخدم فئة مستمدة بالفعل UnitConverter, ، سيتعين عليك التحقق من الواجهة لمعرفة ما إذا كان مصمم تلك الفئة جيدًا بما يكفي لفضح طريقة تُرجع عامل الضرب.

النظر إلى بعض فصول JSCIENCE المستمدة من UnitConverter:

  • MultiplyConverter لديه getFactor() الطريقة التي تُرجع العامل المستخدم في التحويل.
  • AddConverter لديه getOffset() الطريقة التي تُرجع الإزاحة التي يضيفها المحول في التحويل.
  • RationalConverter, ، إذا فهمت ذلك بشكل صحيح ، فإنه يتحول عن طريق ضرب القيمة التي يتم تحويلها بواسطة حاصل القسمة من رقمين - توزيعات الأرباح والقسمة. الفصل لديه طرق ، getDividend() و getDivisor() لإعادة توزيعات الأرباح والقسمة ، حتى تتمكن من أداء القسم بنفسك لتقريب الحاصل.

لذلك أعتقد أن الكود الخاص بك (أدناه) هو خطأ. العامل ليس هو المقسوم ، كما لديك هنا - إنه الحاصل.

RationalConverter rationalConverter = (RationalConverter) unitConverter;
double divisor = rationalConverter.getDivisor().doubleValue();
double dividend = rationalConverter.getDividend().doubleValue();
factor = divisor;
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top