您是否可以使用类似于Java中python关键字args的概念来最小化访问器方法的数量?

您是否可以使用类似于Java中python关键字args的概念来最小化访问器方法的数量?,java,python,dictionary,accessor,keyword-argument,Java,Python,Dictionary,Accessor,Keyword Argument,我最近了解到,在Python 3中,为了最大限度地减少类的访问器方法的数量,可以使用字典来基本上只有一组访问器方法,如下所示: def __init__(self, **kwargs): self.properties = kwargs def get_properties(self): return self.properties def get_property(self, key): return self.properties.get(key, None)

我最近了解到,在Python 3中,为了最大限度地减少类的访问器方法的数量,可以使用字典来基本上只有一组访问器方法,如下所示:

def __init__(self, **kwargs):
    self.properties = kwargs

def get_properties(self):
    return self.properties

def get_property(self, key):
    return self.properties.get(key, None)

这看起来非常有用,我想在Java中应用类似的东西。我一直在研究可能具有多个属性的应用程序,创建和跟踪所有访问器方法可能是一件痛苦的事情。是否有一种类似的策略可以用于Java?

如果它适合并且最适合的话,请使用该模式,但它确实应该是Java规则的一个例外-它可能不合适

Java中的最佳实践是对每个变量使用getter和setter方法。是的,如果你的懒惰让你的IDE自动生成代码,那么会有更多的代码。它在那里有很好的理由。有很多很好的理由。有的是,

  • 促进私有变量
  • 定义其他类的外部接口,允许类控制设置或获取变量的内容和方式
  • 通过建立处理对象变量的标准方法,促进良好的编码实践

在这里移植此模式会遇到的问题是由于键入。Python是动态类型的,Java是静态类型的。因此,为了在Java中使用相同的模式,必须将值存储在字符串/对象数组中,然后以对象或字符串的形式返回它们。那你以后就得把它们转换了。也许如果你的“属性”都是字符串,那就没问题了。规则也有例外,但是你需要知道所有的规则才能很好地打破它们。如果它们是不同的类型(字符串、int、CustomObject等),请不要使用Python中使用的相同模式。

我不确定这是否对您有帮助,但我还是会尝试回答。我先做一个类变量。然后我会制作一个包含一个列表的类字典:变量。然后我让函数以Dictionary作为参数。

不,java中没有kwargs。相反,您可以使用java将类似于函数的内容保存为java属性

你可以这样做:

useKwargs("param1=value1","param2=value2");
示例代码:

public void useKwargs(String... parameters) {

        Properties properties = new Properties();

        for (String param : parameters) {
            String[] pair = parseKeyValue(param);

            if (pair != null) {
                properties.setProperty(pair[0], pair[1]);
            }

        }

        doSomething(properties);
    }

    public void doSomething(Properties properties) {
        /**
         * Do something using using parameters specified in the properties
         */

    }

    private static String[] parseKeyValue(String token) {
        if (token == null || token.equals("")) {
            return null;
        }

        token = token.trim();

        int index = token.indexOf("=");

        if (index == -1) {
            return new String[] { token.trim(), "" };
        } else {
            return new String[] { token.substring(0, index).trim(),
                    token.substring(index + 1).trim() };
        }

    }

您可以使用Pythonduck•:)“但这确实应该是Java规则的一个例外——它可能不合适。”但这并没有说明为什么,原则上是这样的?实际上,正如您所注意到的,这是因为Java的静态类型不允许这样做。但从原则上讲,如果语言能够处理它,那将是一件好事。自动生成访问器页面的IDE是一个拐杖,它会导致松散的不可读代码。不是特写,被否决了。IDE可以为您编写,但不能为您阅读。好的理由并不是真正的理由:1。提升私有变量-本身不是一个值。目的是什么?2.使用“接口”关键字定义的外部接口。如果你需要一个去创造它。在代码库中添加更多的单词,并假装这是一个接口,这不会给您带来任何好处。3.其他选择也是如此。