Возвращать различные типы данных из метода в 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()
i, придумав следующее решение.
создать вызов класса 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;
}
Теперь мой вопрос, есть ли более простой способ достичь этого?
Ответы
Ответ 1
Наконец, я думал, что мой путь лучше, поскольку, когда число возвращаемых типов выше, этот вид реализации делает это наилучшим образом.
public static ReturningValues myMethod() {
ReturningValues rv = new ReturningValues();
rv.setValue("value");
rv.setIndex(12);
return rv;
}
Ответ 2
Нет. Java-методы могут возвращать только один результат (void
, примитив или объект), а создание класса struct
-type, как это, именно так, как вы это делаете.
В качестве примечания часто можно сделать такие классы, как ваш 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
может быть передано, например, между потоками, без каких-либо проблем, связанных с случайным сбоем синхронизации.
Ответ 3
Я создаю различные типы возвращаемых данных, используя enum. Он не определяется автоматически. Эта реализация выглядит как шаблон factory.
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;
}
}
}
Unit Test:
public class MultipleReturnTypeTest {
@Test
public void returnIntegerOrString() {
Assert.assertTrue(SmartReturn.IntegerType.comeback("1") instanceof Integer);
Assert.assertTrue(SmartReturn.DoubleType.comeback("1") instanceof Double);
}
}
Ответ 4
В общем случае, если вы не уверены в том, какое значение вы вернете, вы должны рассмотреть возможность использования возвращаемого типа как суперкласса всех возвращаемых значений. В этом случае, когда вам нужно вернуть 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
}
Ответ 5
Это может быть одно из решений. Но ваше настоящее решение достаточно хорошее. Вы также можете добавить новые переменные и по-прежнему держать их в чистоте, что невозможно сделать с настоящим кодом.
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;
}
Ответ 6
подход, который вы приняли, хорош.
Просто реализация может быть лучше.
Например, 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
}
Ответ 7
вы можете получить возврат как объект. Вы создаете этот объект "на лету" в вашем
function: if(int)
return new object(){
int nr=..
}
то же самое для строки. Но я обеспокоен тем, что это дорогое решение...
Ответ 8
@ruchira у вас это лучшее решение. Но я думаю, что если речь идет только о целых числах и строках, мы можем сделать это намного проще и проще...
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
}
}
я надеюсь, что это было полезно.. :)
Ответ 9
Класс, который вы ищете, уже существует. 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 и идеально подходит для ситуаций, подобных этим.
Ответ 10
Я знаю, что это поздно, но я подумал, что это будет полезно для того, кто придет искать ответ на этот вопрос. Вы можете использовать Bundle
для возврата нескольких значений типа данных без создания другого метода. Я попробовал и работал отлично.
В вашей главной операции, где вы вызываете метод:
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: Я не уверен, что это нормально, чтобы реализовать Bundle, как это, но для меня это получилось отлично.
Ответ 11
Я просто хочу высказать свое мнение
Таким образом, вам нужно создать общий тип Return и реализовать его с помощью различных типов конкретных возвращаемых типов. Класс 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 //
}
}
Ответ 12
Перегрузка метода может пригодиться здесь
Как:
<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!
}
}