【问题标题】:How does a method get called by a constant? [closed]一个方法如何被一个常量调用? [关闭]
【发布时间】:2018-02-08 19:22:54
【问题描述】:

我正在设计一个用于转换单位之间距离的程序,并已获得代码来测试这一点。我不明白如何编写我的方法,以便可以通过常量调用。给出以下代码:

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 中的常量调用?

【问题讨论】:

  • 这看起来像 enum,而不是常量。
  • 欢迎来到 Stack Overflow!请拿起tour,环顾四周,通读help center,尤其是How do I ask a good question? 分配通常不是任意的;您的讲师、教程或课程将涵盖使您能够做到这一点的必要主题。 查看您的课程资料、课堂笔记等并尝试完成这项工作。 如果您遇到特定问题,请彻底研究它,search thoroughly here,如果您仍然遇到问题,请发布您的代码和问题描述。人们会很乐意提供帮助。
  • 可能是枚举,可能只是(非枚举)类的实例。
  • (试图弄清楚METER.fromMetricMETER.toMetric 会做什么......)
  • 是的,我明白了。但任务明确指出我要创建一个名为 DiatanceUnit 的类,它应该包含一个构造函数 DistanceUnit(double meterPerUnit) 和常量 PLANCK、METER、FOOT 和 PARSEC,并且已经给出了一个表,其中包含用于它们的值

标签: java


【解决方案1】:

请记住:中存在方法。是的,您也可以在接口上定义方法 - 但重点是:您只能在对象或类(当它们是静态时)上调用方法。

从这个意义上说,你必须首先弄清楚你的常量的类型。换句话说:您首先必须了解“CONSTANT”只是指具有特定名称的某个对象。

从那里开始:您已经以某种方式定义了名为 CONSTANT 的对象的 type。而且,当您想要调用该类型对象的方法时,您必须将它们添加到该类型。

换句话说,假设你有类似的东西:

class DistanceUnit {
  public final static Foo METER = new Foo(...);

你需要

class Foo {
  public static String fromMetric(int value);

例如。

仅作记录:DistanceUnit.METER 是指类中的静态字段还是 枚举 并不重要 - 你的 todo 是相同的: METER 所代表的类型 需要相应的方法。如果您不了解这些概念之间的区别,请开始阅读here 了解枚举和there 了解静态字段。

【讨论】:

  • 公共静态最终双 METER = 1;公共静态最终双脚= 0.3048;公共静态最终双 PARSEC = 3.08567758 * Math.pow(10, 16);公共静态最终双 PLANCK = 1.616229 * Math.pow(10, -35);这是我在类 DistanceUnit 中的常量声明。我可能离这里很远,但你是说原始类型 double 必须有方法吗?
  • 您能阅读您在此评论中添加的代码吗?真的吗?请相应地增强您的问题,而不是像这样在 cmets 中提供更多信息!我要说的是: METER 的类型必须是可以添加方法的类型。因为你拥有那种类型!因此你不能在这里使用 double 。您需要的所有信息都已经写在我的答案中!
  • 不,像double 这样的原语没有可以调用它们的方法。但是,您也可以将类定义为 constants,而不仅仅是原语。 常量这个词通常只指staticfinal
  • @Zabuza - 您不能在 Java 中使用 staticfinal 限定符将对象标记为常量。它们只影响对象的引用
  • @AndyThomas 是的,我当然是这个意思。但感谢您澄清是否有人不知道。
【解决方案2】:

cmets 和来自@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,但我把它留给你作为练习。

【讨论】:

  • 我懒得在手机上输入更多代码。我投票支持您添加更多详细信息!
  • 谢谢。当我看到@Niklas Westerberg 对您的答案发表评论时,我决定添加我的答案。
【解决方案3】:

一个枚举就足够了。 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) {
     ...
   }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-15
    • 1970-01-01
    相关资源
    最近更新 更多