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;
        }
}
好的,很好。。。但绝对不是。如果我想添加metric3metric4,我必须再次复制粘贴大量内容,这就是问题所在。在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添加了一个更静态的选项