gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 12:20:21 25 4
gpt4 key购买 nike

我这里有以下代码。我需要从我的主类中调用meterNumber 字段,但正如您所看到的,它是空的。我需要它来获取meterNumber的值是load方法。

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 中得到null 的第一个想法可能是你还没有给它一个值。如果你只是定义一个变量为 public Type x如果不初始化它,它的值将为空。您是否在调用 System.out.println(Meter.meterNumber) 之前为其赋值? ?

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

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

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

最后,你有一个方法,getMeterNumber ,根本不执行任何实际功能。 meterNumber是一个公共(public)字段 - 拥有一个最终执行与引用meterNumber相同的操作的函数有什么意义,以及允许两者都有什么意义?

要解决这一切,首先我要更改 meterNumber来自public static到只是public 。其次,我会将 load() 的所有逻辑移至 Meter 之外的方法中。目的。一个Meter不需要知道它是如何制作的,或者如何与用户交谈。它需要知道的是它的数量和关税是多少,所以不要给它更多的知识或责任。询问用户电表编号是多少,然后询问所有费率是多少,然后将这些值传递给 Meter()构造函数。

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com