Java 更通用的返回

Java 更通用的返回,java,generics,Java,Generics,查看一些代码清理,我想知道处理此问题的最佳方法: 拥有一个包含一些私有变量的类,如: myBool1, myBool2, myBool3 myInt1, myInt2, myInt3 myString1, myString2, myString3 执行对返回值通用的getter函数的最佳方法是什么?所以如果我打电话给getter,比如: myNewBool=<blah>.get("myBool1") myNewString=<blah>.get("myString2")

查看一些代码清理,我想知道处理此问题的最佳方法:

拥有一个包含一些私有变量的类,如:

myBool1, myBool2, myBool3
myInt1, myInt2, myInt3
myString1, myString2, myString3
执行对返回值通用的getter函数的最佳方法是什么?所以如果我打电话给getter,比如:

myNewBool=<blah>.get("myBool1")
myNewString=<blah>.get("myString2")
myNewInt=<blah>.get("myInt3") 
myNewBool=.get(“myBool1”)
myNewString=.get(“myString2”)
myNewInt=.get(“myInt3”)

有人有什么建议吗

如果你不知道你想要得到什么,你就不可能真正拥有一个通用的getter,例如:

boolean myNewBool= get("myString1");
如果
get
返回一些东西,但您不知道这些东西是否与布尔值兼容,那么可能会发生可怕的事情

你可以试试这个:

public <T> get(String element){
    return (T) elementToGet;
}
public get(字符串元素){
返回(T)元素集合;
}
但是,在调用get方法时,必须指定返回类型

String element = myObject.<String>get("element");
String元素=myObject.get(“元素”);
以下是不好的一面:

  • 不能直接使用基本体
  • 你可以有很多ClassCastException
  • 如果您拼错了一个属性名,则在运行它之前,您不会看到它
  • 如果您不公开一个好的公共API,人们就必须知道所有可能的属性才能使用它,如上所述,拼写错误的属性(或不精确的属性)直到运行时才会被看到
  • 您必须知道返回时间,并在每次使用方法时键入它
  • 您必须在
    get
    方法中键入一个很长(而且很难闻)的代码来使用每个可能的属性(如果您仍然希望有一些私有的且不可访问的属性),或者更糟糕的是,使用反射来查找正确的属性
所以肯定不是个好主意

相反,您可以使用好的getter//setter,如果有很多getter//setter,则使用IDE生成它们

另一种方法是使用lombok项目


资源:

关于同一主题:


如果您不知道想要获得什么,那么就不可能真正拥有通用的getter,例如:

boolean myNewBool= get("myString1");
如果
get
返回一些东西,但您不知道这些东西是否与布尔值兼容,那么可能会发生可怕的事情

你可以试试这个:

public <T> get(String element){
    return (T) elementToGet;
}
public get(字符串元素){
返回(T)元素集合;
}
但是,在调用get方法时,必须指定返回类型

String element = myObject.<String>get("element");
String元素=myObject.get(“元素”);
以下是不好的一面:

  • 不能直接使用基本体
  • 你可以有很多ClassCastException
  • 如果您拼错了一个属性名,则在运行它之前,您不会看到它
  • 如果您不公开一个好的公共API,人们就必须知道所有可能的属性才能使用它,如上所述,拼写错误的属性(或不精确的属性)直到运行时才会被看到
  • 您必须知道返回时间,并在每次使用方法时键入它
  • 您必须在
    get
    方法中键入一个很长(而且很难闻)的代码来使用每个可能的属性(如果您仍然希望有一些私有的且不可访问的属性),或者更糟糕的是,使用反射来查找正确的属性
所以肯定不是个好主意

相反,您可以使用好的getter//setter,如果有很多getter//setter,则使用IDE生成它们

另一种方法是使用lombok项目


资源:

关于同一主题:


  • 这真是个糟糕的主意。我不知道为什么为每个私有变量创建一个getter/setter是个问题,但是传递映射到变量符号名的字符串将很难维护和混淆。你不需要这是通用的;每个变量都代表不同的数量,应该这样访问它们。

    这真是一个糟糕的想法。我不知道为什么为每个私有变量创建一个getter/setter是个问题,但是传递映射到变量符号名的字符串将很难维护和混淆。你不需要这是通用的;每个变量代表一个不同的数量,应该这样访问它们。

    首先,您应该询问这种解决方案的利弊

    优点:

    • 一种方法而不是多种方法
    缺点:

    • 对类的用户来说不直观(经典的getter更常见)
    • 不能有只因返回类型不同而不同的重载,因此必须有getBool、getInt等方法
    • 它更慢-你必须传递字符串,检查有效性,在地图中查找
    建议的解决方案的唯一优点是不重复get()/set()代码。然而,由于这些方法通常是由IDE生成的,并且只包含一行命令,所以我不认为这是一个大问题


    要回答您的实际问题,您可以使用name属性映射创建一个HashMap。或者,您可以使用Java反射来访问属性。第二种解决方案更一般,但也更难编写。

    首先,你应该问这样一种解决方案的优缺点是什么

    优点:

    • 一种方法而不是多种方法
    缺点:

    • 对类的用户来说不直观(经典的getter更常见)
    • 不能有只因返回类型不同而不同的重载,因此必须有getBool、getInt等方法
    • 它更慢-你必须传递字符串,检查有效性,在地图中查找
    建议的解决方案的唯一优点是不重复get()/set()代码。但是,由于这些方法通常由IDE生成,并且只包含