Java 如何为每个属性抽象创建相同的方法?
比如说,我写了以下课程:Java 如何为每个属性抽象创建相同的方法?,java,Java,比如说,我写了以下课程: public class Metrics { private static int metric1 = 0; public static int countMetric1() { metric1 += 1; return 0; } public static int resetMetric1() { int
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;
}
}
我对它进行了测试,效果良好。但是我还需要检查度量值2。让我们更改代码以适应这种情况
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;
}
}
好的,很好。。。但绝对不是。如果我想添加metric3或metric4,我必须再次复制粘贴大量内容,这就是问题所在。在Java中,有没有办法重构它以避免重复并保持代码的“静态性”?(由于代码的上下文,事情必须是静态的)
额外:如果这在Java中是不可能的,那么在其他语言中是否可能
注1:这是示例代码。因此,无需对变量名大惊小怪
注2:任何关于如何改进问题标题的建议都很好。:) 最简单的方法是创建一个度量类:
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");
既然您似乎更喜欢静态访问,那么简单的地图怎么样
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);
}
}
公共类度量{
私有静态映射metricsMap=newhashmap();
公共静态int countMetric(字符串度量){
int newValue=metricsMap.compute(公制,
(s,value)->value==null
?1:值+1);
返回newValue-1/*旧值*/;
}
公共静态无效重置度量(字符串度量){
metricsMap.remove(公制);
}
}
你也知道什么是臭的吗?具有属性metric1
,metric2
,metric3
。。。这似乎是一个问题。你到底想解决什么问题?如果您不想编写getter和setter,请看一看(注意:ProjectLombok使用字节码操作)。为什么这些度量必须是静态的?如果您不想为每个度量使用单独的字段,为什么不使用映射(可能带有枚举键)?然后,您将拥有一个接受额外枚举参数的count
和reset
方法。与其尝试将所有度量分组到一个类中,不如使用一个名为Counter的类(看起来这就是您要找的),该类具有计数、名称和一些用于递增/重置的公共方法?您可以创建该类的n个实例,并将它们保存在一个集合中。@Turing85更不用说静态属性metric1
,metric2
,metric3
有多臭了……很好。但它的缺点是失去了代码的“静态性”。)(已经编辑了这个问题,反映了这个事实)@LLCampos是真的,但我不确定我是否认为这是一个缺点。@LLCampos添加了一个更静态的选项