我在这里有以下代码。我需要从主类中调用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相同的功能的函数有什么意义,而允许两者都具有什么意义呢?
要解决所有问题,首先我将meterNumber
从public static
更改为public
。其次,我将把load()的所有逻辑移到Meter
对象之外的方法中。 Meter
不需要知道它的制作方式或与用户交谈的方式。它需要知道的是数量和关税,所以不要给它更多的知识或责任。询问用户什么是电表号,然后询问所有费率是多少,然后将这些值传递给Meter()
构造函数。
关于java - 如何设置字段的值,以便可以从另一个类调用它?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26708240/