public static void main(String args[]) {
myMethod(); // i am calling static method from main()
}
.
public static ? myMethod(){ // ? = what should be the return type
return value;// is String
return index;// is int
}
myMethod()
将返回 String 和 int 值。因此,从main()
获取这些返回值,我想出了以下解决方案。
创建班级通话
ReturningValues
public class ReturningValues {
private String value;
private int index;
// getters and setters here
}
并按如下方式更改
myMethod()
。
public static ReturningValues myMethod() {
ReturningValues rv = new ReturningValues();
rv.setValue("value");
rv.setIndex(12);
return rv;
}
现在我的问题是,有没有更简单的方法来实现这一目标?
我使用枚举创建各种返回类型。它不会自动定义。该实现看起来像工厂模式。
public enum SmartReturn {
IntegerType, DoubleType;
@SuppressWarnings("unchecked")
public <T> T comeback(String value) {
switch (this) {
case IntegerType:
return (T) Integer.valueOf(value);
case DoubleType:
return (T) Double.valueOf(value);
default:
return null;
}
}
}
单元测试:
public class MultipleReturnTypeTest {
@Test
public void returnIntegerOrString() {
Assert.assertTrue(SmartReturn.IntegerType.comeback("1") instanceof Integer);
Assert.assertTrue(SmartReturn.DoubleType.comeback("1") instanceof Double);
}
}
不。 Java 方法只能返回一个结果(
void
、基元或对象),而创建像这样的 struct
类型的类正是您的做法。
请注意,通常可以使像您的
ReturningValues
这样的类不可变,如下所示:
public class ReturningValues {
public final String value;
public final int index;
public ReturningValues(String value, int index) {
this.value = value;
this.index = index;
}
}
这样做的优点是
ReturningValues
可以在线程之间传递,而不用担心意外地使事情不同步。
通常,如果您不确定最终将返回什么值,您应该考虑使用 return-type 作为所有返回值的超类。在这种情况下,如果您需要返回 String 或 int,请考虑返回 Object 类(它是 java 中定义的所有类的基类)。
但要小心在调用此方法的地方进行 instanceof 检查。否则你最终可能会得到 ClassCastException。
public static void main(String args[]) {
Object obj = myMethod(); // i am calling static method from main() which return Object
if(obj instanceof String){
// Do something
}else(obj instance of Integer) {
//do something else
}
immutable,那就更好了。
// this approach is better
public static ReturningValues myMethod() {
ReturningValues rv = new ReturningValues("value", 12);
return rv;
}
public final class ReturningValues {
private final String value;
private final int index;
public ReturningValues(String value, int index) {
this.value = value;
this.index = index;
}
}
或者如果你有很多键值对,你可以使用 HashMap
public static Map<String,Object> myMethod() {
Map<String,Object> map = new HashMap<String,Object>();
map.put(VALUE, "value");
map.put(INDEX, 12);
return Collections.unmodifiableMap(map); // try to use this
}
public static Entry<Integer,String> myMethod(){
return new SimpleEntry<>(12, "value");
}
后来:
Entry<Integer,String> valueAndIndex = myMethod();
int index = valueAndIndex.getKey();
String value = valueAndIndex.getValue();
它只是一个简单的两字段数据结构,存储键和值。 如果您需要进行任何特殊处理、存储两个以上字段或有任何其他边缘情况,您应该创建自己的类,但除此之外,
Map.Entry
是未充分利用的 Java 类之一,非常适合这些情况.
private static final int INDEX_OF_STRING_PARAM = 0;
private static final int INDEX_OF_INT_PARAM = 1;
public static Object[] myMethod() {
Object[] values = new Object[2];
values[INDEX_OF_STRING_PARAM] = "value";
values[INDEX_OF_INT_PARAM] = 12;
return values;
}
因此您需要创建一个通用的返回类型并通过不同类型的具体返回类型来实现。 Service 类可以创建不同类型的对象具体类并作为泛型类型返回。
public interface GenericReturnType{
public static RETURN_TYPE enum{
MACHINE, PERSON;
}
public RETURN_TYPE getReturnType();
}
public class PersonReturnType implements GenericReturnType{
// CONSTRUCTORS //
// GETTRE AND SETTER //
public RETURN_TYPE getReturnType(){
return PERSON;
}
public String getAddress(){
return something;
}
}
public class MachineReturnType implements GenericReturnType{
// CONSTRUCTORS //
// GETTRE AND SETTER //
public RETURN_TYPE getReturnType(){
return MACHINE;
}
public String getManufatureName(){
return something;
}
}
public class TestService{
public GenericReturnType getObject(// some input //){
GenericReturnType obj ;
if(// some code //){
obj = new PersonReturnType();
// some code //
}
if(// some code //){
obj = new MachineReturnType();
// some code //
}
return obj;
}
}
public class TestDriver{
TestService service = new TestService();
GenericReturnType genObj = TestService.getObject(// some input //);
if(genObj.getReturnType() == RETURN_TYPE.MACHINE){
// SOME CODE //
}
if(genObj.getReturnType() == RETURN_TYPE.PERSON){
// SOME CODE //
}
}
Bundle
返回多个数据类型值,而无需创建其他方法。我尝试了一下,效果很好。
在您调用该方法的 MainActivity 中:
Bundle myBundle = method();
String myString = myBundle.getString("myS");
String myInt = myBundle.getInt("myI");
方法:
public Bundle method() {
mBundle = new Bundle();
String typicalString = "This is String";
Int typicalInt = 1;
mBundle.putString("myS", typicalString);
mBundle.putInt("myI", typicalInt);
return mBundle;
}
我不确定实现这样的 Bundle 是否可以,但对我来说,效果很完美。
public static ReturningValues myMethod() {
ReturningValues rv = new ReturningValues();
rv.setValue("value");
rv.setIndex(12);
return rv;
}
class B {
public String myfun() {
int a=2; //Integer .. you could use scanner or pass parameters ..i have simply assigned
String b="hi"; //String
return Integer.toString(a)+","+b; //returnig string and int with "," in middle
}
}
class A {
public static void main(String args[]){
B obj=new B(); // obj of class B with myfun() method
String returned[]=obj.myfun().split(",");
//splitting integer and string values with "," and storing them in array
int b1=Integer.parseInt(returned[0]); //converting first value in array to integer.
System.out.println(returned[0]); //printing integer
System.out.println(returned[1]); //printing String
}
}
我希望它有用..:)
中“动态”创建该对象
function: if(int)
return new object(){
int nr=..
}
字符串也一样。但我担心这是一个昂贵的解决方案......
public ArrayList divineCast(String object) {
try
{
Integer result = Integer.parseInt(object);
ArrayList<Integer> generic = new ArrayList<Integer>();
generic.add(result);
return generic;
}
catch(Exception e)
{
//not a Integer
}
try
{
Float result = Float.parseFloat(object);
ArrayList<Float> generic = new ArrayList<Float>();
generic.add(result);
return generic;
}
catch(Exception e)
{
//not a Float
}
try
{
Double result = Double.parseDouble(object);
ArrayList<Double> generic = new ArrayList<Double>();
generic.add(result);
return generic;
}
catch(Exception e)
{
//not a double
}
try
{
Boolean result = Boolean.parseBoolean(object);
ArrayList<Boolean> generic = new ArrayList<Boolean>();
generic.add(result);
return generic;
}
catch(Exception e)
{
//not a Boolean
}
try
{
String result = String.valueOf(object);
ArrayList<String> generic = new ArrayList<String>();
generic.add(result);
return generic;
}
catch(Exception e)
{
//not a String
}
return null;
}
然后你可以像这样调用then函数
String test1 = "0.90854938";
String test2 = "true";
System.out.println(divineCast(test1).get(0));
System.out.println(divineCast(test1).get(0).getClass());
System.out.println(divineCast(test2).get(0));
System.out.println(divineCast(test2).get(0).getClass());
Java 不会强制您在函数声明中声明要返回的 ArrayList 的类型,因此您可以返回任何类型的 ArrayList。
static List<Object> multiTypeInputOut (int a, double b, String c, List<Object> d)
{
List<Object> multiTypes = new ArrayList<>();
multiTypes.add(a);
multiTypes.add(b);
multiTypes.add(c);
multiTypes.add(d);
return multiTypes;
}
调用此类方法/函数时,示例如下(只需记住并正确设置返回类型的顺序):
List<Object> HelloWorldStrList = new ArrayList<Object>(Arrays.asList("Welcome", "Hello", "World"));
List<Object> multiType = multiTypeInputOut (1, 2.1, "HelloWorld", HelloWorldStrList);
int entry1 = (int) multiType.get(0);
double entry2 = (double) multiType.get(1);
String entry3 = (String) multiType.get(2);
List<Object> entry4 = (List<Object>) multiType.get(3);
<code>
public class myClass
{
int add(int a, int b)
{
return (a + b);
}
String add(String a, String b)
{
return (c + d);
}
public static void main(String args[])
{
myClass ob1 = new myClass);
ob1.add(2, 3);
//will return 5
ob1.add("Hello, ", "World!");
//will return Hello, World!
}
}