Возвращает другой тип данных из метода в java?
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;
}
теперь мой вопрос,есть ли простой способ добиться этого??
11 ответов
нет. Методы 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
может передаваться, например, между потоками, без каких-либо опасений о случайном выходе вещей из синхронизации.
Я создаю различные типы возврата с помощью перечисления. Он не определяется автоматически. Эта реализация выглядит как фабричный шаблон.
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);
}
}
Как правило, если вы не уверены, какое значение вы вернете, вы должны рассмотреть возможность использования 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
}
Это может быть одним из решений. Но ваше нынешнее решение достаточно хорошо. Вы также можете добавить новые переменные и сохранить их чистыми, что невозможно сделать с помощью настоящего кода.
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;
}
подход, который вы приняли, хорош. Просто реализация может быть лучше. Например, ReturningValues должны быть четко определены и Его лучше, если вы можете сделать ReturningValues как неизменяемые.
// 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
}
вы можете иметь возврат в качестве объекта. Вы создаете этот объект "на лету" в своем
function: if(int)
return new object(){
int nr=..
}
то же самое для строки. Но я обеспокоен тем, что это дорогостоящее решение...
наконец, я подумал, что мой способ лучше, так как, когда количество возвращаемых типов повышается, этот вид реализации делает это наилучшим образом.
public static ReturningValues myMethod() {
ReturningValues rv = new ReturningValues();
rv.setValue("value");
rv.setIndex(12);
return rv;
}
класс, который вы ищете, уже существует. Map.Entry
:
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 и идеально подходит для таких ситуаций.
Я знаю, что это поздно, но я думал, что это будет полезно для кого-то, кто будет искать ответ на этот. Вы можете использовать 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;
}
P. S: Я не уверен, что это нормально для реализации такого пакета, но для меня это сработало отлично.
@ruchira ur решение это само лучше.Но я думаю, что если речь идет только о integer и string, мы можем сделать это очень легко и просто..
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
}
}
Я надеюсь, это было полезно.. :)
перегрузка метода может пригодиться здесь Например:
<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!
}
}