我正在设计一个用于转换单位之间距离的程序,并且已经给出了代码来测试它。我不明白如何编写我的方法,以便可以通过常量调用。提供以下代码:
System.out.println(DistanceUnit.METER.toMetric(100));
System.out.println(DistanceUnit.METER.fromMetric(100));
System.out.println(DistanceUnit.FOOT.toMetric(100));
System.out.println(DistanceUnit.FOOT.fromMetric(100));
System.out.println(DistanceUnit.PLANCK.toMetric(100));
System.out.println(DistanceUnit.PLANCK.fromMetric(100));;
System.out.println(DistanceUnit.PARSEC.toMetric(100));
System.out.println(DistanceUnit.PARSEC.fromMetric(100));
所以我根据赋值中的指令定义了上面的常量,但是如何创建fromMetric和toMetric方法,以便它们可以被DistanceUnits中的常量调用?
答案 0 :(得分:3)
请注意:类上存在方法。是的,您也可以在接口上定义方法 - 但重点是:您只能在对象上或在类上(当它们是静态时)调用方法。
从这个意义上说,你必须首先计算你的CONSTANT的类型。换句话说:你首先必须要理解" CONSTANT"简单地指一些具有特定名称的对象。
从那里开始:你已经以某种方式定义了名为CONSTANT的对象的类型。如果要在该类型的对象上调用方法,则必须将添加到该类型。
换句话说,假设你有类似的东西:
class DistanceUnit {
public final static Foo METER = new Foo(...);
你需要
class Foo {
public static String fromMetric(int value);
例如,。
仅仅是为了记录:MatchUnit.METER是指一个类中的静态字段,还是一个枚举并不重要 - 你的待办事项是相同的:< METER表示的em> type 需要相应的方法。如果您不理解这些概念之间的差异,请开始阅读枚举的here和静态字段的there。
答案 1 :(得分:2)
@GhostCat中的注释和答案应该是实现这些常量所需的全部内容,但我觉得你仍然在考虑基元/字符串而不是对象的常量。在java常量中也可以引用任何对象。
以下是使用接口和具体实现的METER和FOOT实现的示例:
public class DistanceUnit{
public static final Converter METER = new MeterConverter();
public static final Converter FOOT = new FootConverter();
}
public interface Converter{
public double fromMetric(double d);
public double toMetric(double d);
}
public class MeterConverter implements Converter{
@Override
public double fromMetric(double d) {
return d;
}
@Override
public double toMetric(double d) {
return d;
}
}
public class FootConverter implements Converter{
@Override
public double fromMetric(double meters) {
return meters*3.28084;
}
@Override
public double toMetric(double feet) {
return feet*0.3048;
}
}
有更好的方法可以通过将DistanceUnit
替换为枚举来实现此目的,但我将其作为练习留给您。
答案 2 :(得分:0)
单个枚举就足够了。 Java枚举常量是对象。你可以调用它们的方法。
标准样式是使枚举常量大写。
您只需要写一次toMetric()
和fromMetric()
。
public enum DistanceUnit {
METER( 1.0 ),
FOOT( 0.3048 ),
...
;
private m_distanceInMeters;
DistanceUnit( double distanceInMeters ) {
...
}
public double fromMetric(double d) {
...
}
public double toMetric(double d) {
...
}
}