我在这里有以下代码。我需要从主类中调用meterNumber字段,但是您可以看到它为空。我需要它以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方法,因为我认为这将要求我首先创建该类的实例。

最佳答案

关于您为什么要从meterNumber中获取空值的第一个想法可能是您尚未给它赋值。如果仅将变量定义为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()构造函数。

关于java - 如何设置字段的值,以便可以从另一个类调用它?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26708240/

10-12 03:12