您可以使用类似于 python in Java 的关键字参数的概念来最小化访问器方法的数量吗?
Can you use a concept similar to keyword args for python in Java to minimize the number of accessor methods?
我最近在 Python 3 中了解到,要最大限度地减少 class 的访问器方法的数量,您可以使用字典来基本上只有一组访问器方法,如下所示:
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 自动生成它们。这是有充分理由的。很多很好的理由。有些是;
- 提升私有变量
- 定义与其他 classes 的外部接口,允许 class 控制什么以及如何设置或获取变量
- 通过建立处理对象变量的标准方法来促进良好的编码习惯
你在这里移植这个模式时会遇到的问题是由于打字造成的。 Python 是动态类型,Java 是静态类型。因此,为了在 Java 中使用相同的模式,您必须将值存储在类似 string/object 数组的内容中,然后 return 将它们存储为对象或字符串.那么你必须稍后再转换它们。也许如果你的 'properties' 都是字符串,那就没问题了。规则也有例外,但您需要了解所有规则才能很好地打破它们。如果它们是不同的类型(String、int、CustomObject 等),请不要使用您在 Python.
中使用的相同模式
我不确定这是否对您有帮助,但我会尽力回答。我首先创建一个 class 变量。然后我会用一个 lists:Variables 制作一个 class 字典。然后我会让这个函数接受一个字典作为参数。
不,java 中没有 kwargs。相反,您可以通过使用 java varargs 将它们保存为 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() };
}
}
kwargs
是一本字典,因此您可以使用来自 java 的字典类似物:地图。例如:
public class MyClass{
HashMap<String, Object> params;
// constructor for MyClass
public MyClass(HashMap<String, Object> params){
this.params = params;
}
}
另一种选择是增加一个 class MyClassBuilder
:
public class MyClassBuilder {
private int param1 = default1;
private String param2 = default2;
private double param3 = default3;
public MyClassBuilder(){
// nothing to do here
}
public MyClassBuilder setParam1(int x){
param1 = x;
return this;
}
public MyClassBuilder setParam2(String x){
param2 = x;
return this;
}
public MyClassBuilder setParam3(double x){
param1 = x;
return this;
}
public MyClass build(){
return new MyClass(param1, param2, param3);
}
}
在第二种情况下,您确实为 MyClass
定义了一个带有三个参数的构造函数 (public MyClass(int p1, String p2, double p3)
)
在你的主代码中,你可以这样写
MyClassBuilder mcb = new MyClassBuilder();
MyClass mc = mcb.setParam3(3.14).setParam2("foo").build();
我最近在 Python 3 中了解到,要最大限度地减少 class 的访问器方法的数量,您可以使用字典来基本上只有一组访问器方法,如下所示:
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 自动生成它们。这是有充分理由的。很多很好的理由。有些是;
- 提升私有变量
- 定义与其他 classes 的外部接口,允许 class 控制什么以及如何设置或获取变量
- 通过建立处理对象变量的标准方法来促进良好的编码习惯
你在这里移植这个模式时会遇到的问题是由于打字造成的。 Python 是动态类型,Java 是静态类型。因此,为了在 Java 中使用相同的模式,您必须将值存储在类似 string/object 数组的内容中,然后 return 将它们存储为对象或字符串.那么你必须稍后再转换它们。也许如果你的 'properties' 都是字符串,那就没问题了。规则也有例外,但您需要了解所有规则才能很好地打破它们。如果它们是不同的类型(String、int、CustomObject 等),请不要使用您在 Python.
中使用的相同模式我不确定这是否对您有帮助,但我会尽力回答。我首先创建一个 class 变量。然后我会用一个 lists:Variables 制作一个 class 字典。然后我会让这个函数接受一个字典作为参数。
不,java 中没有 kwargs。相反,您可以通过使用 java varargs 将它们保存为 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() };
}
}
kwargs
是一本字典,因此您可以使用来自 java 的字典类似物:地图。例如:
public class MyClass{
HashMap<String, Object> params;
// constructor for MyClass
public MyClass(HashMap<String, Object> params){
this.params = params;
}
}
另一种选择是增加一个 class MyClassBuilder
:
public class MyClassBuilder {
private int param1 = default1;
private String param2 = default2;
private double param3 = default3;
public MyClassBuilder(){
// nothing to do here
}
public MyClassBuilder setParam1(int x){
param1 = x;
return this;
}
public MyClassBuilder setParam2(String x){
param2 = x;
return this;
}
public MyClassBuilder setParam3(double x){
param1 = x;
return this;
}
public MyClass build(){
return new MyClass(param1, param2, param3);
}
}
在第二种情况下,您确实为 MyClass
定义了一个带有三个参数的构造函数 (public MyClass(int p1, String p2, double p3)
)
在你的主代码中,你可以这样写
MyClassBuilder mcb = new MyClassBuilder();
MyClass mc = mcb.setParam3(3.14).setParam2("foo").build();