我在这里有以下代码。我需要从我的主类调用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方法,因为我认为这需要我先创建一个类的实例。
答案 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,以及允许两者的重点是什么?
要解决所有这些问题,我首先要将meterNumber
从public static
更改为public
。其次,我会将load()的所有逻辑移动到Meter
对象之外的方法中。 Meter
不需要知道它是如何制作的,或者如何与用户交谈。它需要知道的是它的数量是什么以及它的关税是什么,所以不要给它更多的知识或责任。询问用户仪表编号是什么,然后询问所有关税是什么,然后将这些值传递给Meter()
构造函数。