更通用的回报
看一些代码清理,我想知道处理这个问题的最佳方法:
有一个类有一些私有变量,如:
myBool1, myBool2, myBool3 myInt1, myInt2, myInt3 myString1, myString2, myString3
执行返回值通用的getter函数的最佳方法是什么? 所以,如果我用以下内容调用getter:
myNewBool=.get("myBool1") myNewString=.get("myString2") myNewInt=.get("myInt3")
有人有什么建议吗?
如果你不知道自己想要什么,就不可能有一个通用的getter,例如:
boolean myNewBool= get("myString1");
如果get
返回一些内容,但你真的不知道这个东西是否与布尔值兼容,并且可能会发生可怕的事情。
你可以试试这个:
public get(String element){ return (T) elementToGet; }
但是在调用get方法时必须指定返回类型。
String element = myObject.get("element");
以下是不好的方面:
- 您无法直接使用基元
- 你可以有很多ClassCastException
- 如果拼错属性名称,则在运行之前不会看到它
- 你没有公开一个漂亮的公共API,人们必须知道evert可能的属性才能使用它,并且如上所述,在运行时之前不会看到拼写错误的属性(或不一致的属性)。
- 您必须知道返回时间并在每次使用方法时键入它
- 您必须在
get
方法中键入一个非常长(并且有臭味)的代码,以使用每个可能的属性(如果您仍然希望有一些私有且无法访问)或更糟糕的是,使用reflection来查找正确的属性。
所以绝对不是一个好主意 。
您可以做的是使用好的旧getter // setter,如果有很多,请使用IDE生成它们。
另一种方法是使用项目lombok。
资源:
- 龙目岛项目
在同一主题上:
- 仅在Eclipse中自动创建getter
- Eclipse生成包中的所有getter setter
- Java Getters和Setters
首先,您应该问一下这种解决方案的优缺点。
优点:
- 一种方法而不是很多方法
缺点:
- 对您class级的用户不直观(经典的getter更常见)
- 你不能只有一个返回类型不同的重载,因此你必须有getBool,getInt等方法。
- 它更慢 – 你必须传递字符串,检查有效性,在地图中查找…
您提出的解决方案的唯一优势是不会重复get()/ set()代码。 但是,由于这些方法通常由IDE生成并且只包含单行命令,因此我不认为这是一个大问题。
要回答您的实际问题 – 您可以使用名称 – 属性映射创建HashMap。 或者,您可以使用Javareflection来访问属性。 第二种解决方案更通用,但也更难写。
这真是个糟糕的主意。 我不确定为什么为每个私有变量创建一个getter / setter是一个问题,但传递映射到变量的符号名称的字符串将难以维护和混淆。 你不需要这是通用的; 每个变量代表不同的数量,因此应该访问它们。
这不会是清理而是陷入困境。 我要么为字段创建3个getter方法,要么完全重新设计它。 但是调用一个函数,以一个字段的名称返回,作为一个参数可以带来什么好处。
编写代码时,您必须在编码时重构代码。 但不是这样的。 解决方案是将逻辑委托给另一个类,将代码包装成更多可用的方法或更改和简化域对象……