看一些代码清理,我想知道解决这个问题的最佳方法:
有一个包含一些私有变量的类,如:
myBool1, myBool2, myBool3
myInt1, myInt2, myInt3
myString1, myString2, myString3
执行返回值通用的getter函数的最佳方法是什么?所以,如果我用以下内容调用getter:
myNewBool=<blah>.get("myBool1")
myNewString=<blah>.get("myString2")
myNewInt=<blah>.get("myInt3")
有人有什么建议吗?
答案 0 :(得分:6)
如果你不知道自己想要什么,你就无法拥有通用的getter,例如:
boolean myNewBool= get("myString1");
如果get
返回一些东西,但你真的不知道这个东西是否与布尔值兼容,可能会发生可怕的事情。
你可以试试这个:
public <T> get(String element){
return (T) elementToGet;
}
但是在调用get方法时必须指定返回类型。
String element = myObject.<String>get("element");
以下是不好的方面:
get
方法中键入一个非常长(且有臭味)的代码才能使用每个可能的属性(如果您仍然想要一些私有且无法访问)或更糟糕的是,请使用反射来查找正确的属性。如此明确地不是一个好主意。
你可以做的是使用好的旧getter // setter,如果有很多,请用你的IDE生成它们。
另一种方法是使用项目lombok。
资源:
关于同一主题:
答案 1 :(得分:3)
首先你应该问一下这种解决方案的优缺点。
优点:
缺点:
您提出的解决方案的唯一优势是不会重复get()/ set()代码。但是,由于这些方法通常由IDE生成并且只包含单行命令,因此我不认为这是一个大问题。
要回答您的实际问题 - 您可以使用名称 - 属性映射创建HashMap。或者,您可以使用Java反射来访问属性。第二种解决方案更为通用,但也更难写。
答案 2 :(得分:1)
这真是个糟糕的主意。我不确定为什么为每个私有变量创建一个getter / setter是一个问题,但是传递映射到变量的符号名称的字符串将难以维护和混淆。你不需要这是通用的;每个变量代表不同的数量,它们应该被访问。
答案 3 :(得分:0)
它不会被清理干净而是陷入困境。我要么为字段创建3个getter方法,要么完全重新设计它。但是调用一个函数,用一个字段的名称来返回,作为一个参数可以带来什么好处。
编码时,您必须在编码时重构代码。但不是这样的。解决方案是将逻辑委托给另一个类,将代码包装成更多可用的方法或更改和简化域对象......