gpt4 book ai didi

java - 如何为每个属性抽象创建相同的方法?

转载 作者:行者123 更新时间:2023-11-29 04:19:43 24 4
gpt4 key购买 nike

假设我编写了以下类:

public class Metrics {
private static int metric1 = 0;

public static int countMetric1() {
metric1 += 1;
return 0;
}

public static int resetMetric1() {
int currentCount = metric1;
metric1 = 0;
return currentCount;
}
}

我测试了它,它有效。但我还需要检查 metric2。让我们更改代码以适应这一点。

public class Metrics {
private static int metric1 = 0;
private static int metric2 = 0;

public static int countMetric1() {
metric1 += 1;
return 0;
}

public static int resetMetric1() {
int currentCount = metric1;
metric1 = 0;
return currentCount;
}

public static int countMetric2() {
metric2 += 1;
return 0;
}

public static int resetMetric2() {
int currentCount = metric2;
metric2 = 0;
return currentCount;
}
}

好吧,很好……但绝对不是DRY .如果我想添加 metric3metric4,我将不得不再次复制粘贴很多内容,那就是 smelly .在 Java 中有什么方法可以重构它以避免重复并保持代码的“静态”? (由于代码的上下文,事物必须是静态的)

额外:如果这在 Java 中不可能,那么在任何其他语言中是否可能?

注意 1:这是示例代码。因此无需为变量名大惊小怪。

注意 2: 任何关于如何改进问题标题的建议都会很好。 :)

最佳答案

最简单的做法是创建一个 Metric 类:

public class Metric {

private int count = 0;
private final String name;


public Metric(final String name) {
this.name = name;
}

@Override
public String toString() {
return String.format("Metric{name='%s', count=%d}", name, count);
}

public int count() {
return ++count;
}

public void reset() {
count = 0;
}
}

在你的类里面,你会这样分配它:

private Metric someMetric = new Metric("Whatever you want to measure");

既然您似乎更喜欢静态访问的东西,那么简单的 Map 怎么样?

public class Metrics {

private static Map<String, Integer> metricsMap = new HashMap<>();

public static int countMetric(String metric) {
int newValue = metricsMap.compute(metric,
(s, value) -> value == null
? 1 : value + 1);
return newValue - 1 /* old value */;
}

public static void resetMetric(String metric){
metricsMap.remove(metric);
}
}

关于java - 如何为每个属性抽象创建相同的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50140842/

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