如何设置我的字段的值,以便我可以从另一个类调用它?

时间:2014-11-03 05:20:57

标签: java field

我在这里有以下代码。我需要从我的主类调用meterNumber字段,但是你可以看到它为null。我需要它取meterNumber的值是加载方法。

import java.io.*;
import java.util.*;

public class Meter {

   public static MeterNumber meterNumber;

   private Tariff[] tariffs;

   public Meter(MeterNumber meterNumber, Tariff[] tariffs) {
      this.meterNumber = meterNumber;
      this.tariffs = tariffs;
   }

   public static Meter load(Scanner sc) {
       MeterNumber meterNumber = MeterNumber.fromString(sc.nextLine());
       int n = sc.nextInt();
       Tariff[] tariffs = new Tariff[n];
       String kind = sc.next();
       while (sc.hasNextLine()) {
       sc.nextLine();
       for (int i = 0; i < n; i++) {
         //String kind = sc.next();
         //sc.nextLine();
         if (kind.equals("P")) {
            tariffs[i] = PeakTariff.PEAK_TARIFF;
         } else if (kind.equals("O")) {
            tariffs[i] = OffPeakTariff.OFF_PEAK_TARIFF;
         } 
      }
   }
   return new Meter(meterNumber, tariffs);
}

   public MeterNumber getMeterNumber() {
      return meterNumber;
   }

}

我不想使用getter方法,因为我认为这需要我先创建一个类的实例。

1 个答案:

答案 0 :(得分:1)

我第一次想到你为什么从meterNumber获得null可能是因为你还没有给它一个值。如果您只是将变量定义为public Type x而未初始化它,则其值将为null。您在致电System.out.println(Meter.meterNumber)之前为其分配了值吗?

但就其余代码而言,存在一些重大问题。其中之一就是你在这里奇怪地混合了静态和实例的概念。

您有一个实例化的类 - Meter - 具有静态成员meterNumber。这意味着每次实例化新的Meter时,每个meterNumber实例的Meter都会发生变化,并且它们都将反映最新值。如果仪表编号是逻辑上和单独属于每个仪表的东西,则它必须是实例成员。如果每个成员之间的内容相同,则使用静态功能设置一次(如果您不知道,并且需要由用户提供)或更改字段实例成员(如果每个实例成员不同)。不要在非单例的构造函数中设置静态字段。 (或者说,真的。)

此外,您在meterNumber类的实例构造函数中设置了Meter字段,但随后又在load方法中进行了设置。顺便说一下,返回一个Meter对象 - 有一个静态方法执行应该存在于类外的函数的意义(为什么Meter负责扫描来自用户的输入?这与对象的功能或封装有什么关系?)或在构造函数中。

最后,您有一个方法getMeterNumber,它根本不执行任何实际功能。 meterNumber是一个公共领域 - 拥有一个函数的重点是什么,最终做的只是引用meterNumber,以及允许两者的重点是什么?

要解决所有这些问题,我首先要将meterNumberpublic static更改为public。其次,我会将load()的所有逻辑移动到Meter对象之外的方法中。 Meter不需要知道它是如何制作的,或者如何与用户交谈。它需要知道的是它的数量是什么以及它的关税是什么,所以不要给它更多的知识或责任。询问用户仪表编号是什么,然后询问所有关税是什么,然后将这些值传递给Meter()构造函数。