Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么';这个Java方法的返回类型合适吗?_Java - Fatal编程技术网

什么';这个Java方法的返回类型合适吗?

什么';这个Java方法的返回类型合适吗?,java,Java,我们正在实施一个具有战略模式的系统 某些特定方法的调用方需要数据的哈希映射,而在某些情况下,它将是用户定义的DTO。有些人两者都需要 我们如何决定使用哪种返回类型,而不是使用包含Hashmap和DTO的Arraylist?还有更合适的吗 例如: 有些调用者只需要2个字符串,更喜欢Hashmap 同一API的其他调用方需要12个适合放入DTO的值。第一个调用方不需要DTO中的所有元素 第三个调用者需要全部14个值,因此需要两个结构。为什么不直接返回一个对象呢。理想情况下,我会把它作为最后的选择。但

我们正在实施一个具有战略模式的系统

某些特定方法的调用方需要数据的哈希映射,而在某些情况下,它将是用户定义的DTO。有些人两者都需要

我们如何决定使用哪种返回类型,而不是使用包含Hashmap和DTO的Arraylist?还有更合适的吗

例如:

有些调用者只需要2个字符串,更喜欢Hashmap

同一API的其他调用方需要12个适合放入DTO的值。第一个调用方不需要DTO中的所有元素


第三个调用者需要全部14个值,因此需要两个结构。

为什么不直接返回一个对象呢。理想情况下,我会把它作为最后的选择。但是可以考虑返回一个泛型以及

public Object myMethod1(){}

public T myMethod2(){}

在第二种情况下,很明显您可能必须定义通用对象。

为什么不简单地返回一个对象呢。理想情况下,我会把它作为最后的选择。但是可以考虑返回一个泛型以及

public Object myMethod1(){}

public T myMethod2(){}

在第二种情况下,很明显您可能必须定义泛型对象。

使用getter和setter创建一个数据类并返回相同的对象。

使用getter和setter创建一个数据类并返回相同的对象。

泛型如何

public <T> T getPojo(final Object o, final Class<T> returnType)
{
    if (o instanceof HashMap)
    {
        return (T) getPojoHash((HashMap) o);
    }
    return (T) getPojoDTO((DTO) o);
}

private HashMap getPojoHash(final HashMap map)
{ // mount map
    return newMap;
}

private DTO getPojoDTO(final DTO d)
{ // mount dto
    return newDTO;
}
public T getPojo(最终对象o,最终类returnType)
{
if(o HashMap实例)
{
返回(T)getPojoHash((HashMap)o);
}
返回(T)getPojoDTO((DTO)o);
}
私有HashMap getPojoHash(最终HashMap映射)
{//mount-map
返回newMap;
}
私人DTO getPojoDTO(最终DTO d)
{//mount dto
返回newDTO;
}
您可以使用反射来避免使用
returnType
参数。但是我更喜欢打字。

泛型呢

public <T> T getPojo(final Object o, final Class<T> returnType)
{
    if (o instanceof HashMap)
    {
        return (T) getPojoHash((HashMap) o);
    }
    return (T) getPojoDTO((DTO) o);
}

private HashMap getPojoHash(final HashMap map)
{ // mount map
    return newMap;
}

private DTO getPojoDTO(final DTO d)
{ // mount dto
    return newDTO;
}
public T getPojo(最终对象o,最终类returnType)
{
if(o HashMap实例)
{
返回(T)getPojoHash((HashMap)o);
}
返回(T)getPojoDTO((DTO)o);
}
私有HashMap getPojoHash(最终HashMap映射)
{//mount-map
返回newMap;
}
私人DTO getPojoDTO(最终DTO d)
{//mount dto
返回newDTO;
}

您可以使用反射来避免使用
returnType
参数。但是我更喜欢键入。

假设您返回的是泛型类型,并且列表可以是异构的,那么返回对ArrayList的引用并不是一个坏主意。您可以将所有内容封装在另一个类中,但最后,您需要在某个地方维护某种列表

假设您正在返回泛型类型,并且列表可以是异构的,那么返回对ArrayList的引用并不是一个坏主意。您可以将所有内容封装在另一个类中,但最后,您需要在某个地方维护某种列表

您可以使用泛型,但是需要同时返回这两个东西存在一个问题。最好的解决方案是创建一个包含两种返回类型的类,并简单地使用泛型创建一个返回所需内容的方法:

public <T extends SomeReturnObject> List<T> doSomething(Object someObject, Class<T> classToReturn) {
   // Do something here
}
公共列表doSomething(对象someObject,类classToReturn){
//在这里做点什么
}

您可以使用泛型,但需要同时返回这两个东西存在一个问题。最好的解决方案是创建一个包含两种返回类型的类,并简单地使用泛型创建一个返回所需内容的方法:

public <T extends SomeReturnObject> List<T> doSomething(Object someObject, Class<T> classToReturn) {
   // Do something here
}
公共列表doSomething(对象someObject,类classToReturn){
//在这里做点什么
}

如果某些调用者需要
Map
(顺便说一句,在您的接口中不使用具体类型,如
HashMap
),而其他调用者需要对象,那么可能有两个原因:

  • 该方法根据参数返回完全不同的内容(例如,如果设置了标志,则返回权限映射,如果未设置,则返回表示用户本人的对象)

  • 您将返回同一实体的不同视图

在第一种情况下,您的界面存在严重缺陷,应该重新设计。可能需要两种方法来执行不同的任务。你说的“不同的来电者”是什么意思?根据调用方法的人,您决定返回什么

在第二种情况下,考虑一个更通用的模型并返回它。然后让客户端将其转换为适当的格式。有几种方法可以做到这一点:

  • 返回格式不可知类型,并提供转换为映射和对象的方法,以便客户机决定。例如,如果您不确定客户端是喜欢具有属性的弱类型映射还是具有相同属性/字段的强类型对象,请返回具有
    toMap
    toObject
    方法的简单包装器。请注意,在这种情况下,内部表示并不重要,客户机始终使用视图,并且您可以在将来添加新格式

  • 返回具有两个子类的泛型
    Model
    类:
    MapModel
    ObjectModel
    ,在子类中公开适当的getter。不要使用
    instanceof
    ,而是使用访问者模式。在这个模型中,您总是返回一个值,客户机必须能够处理每种格式。如果添加新格式(如
    XmlModel
    ),则需要自定义使用
    Model
    的所有位置以处理新类型。但是,在这种情况下,不需要将内部表示转换为不同的格式


请注意,返回一个
对象
或其任何变体只是在动态语言中登陆,您不再需要任何静态键入帮助。

如果一些调用者需要
映射
(顺便说一句,在您的接口中不使用具体类型,如
HashMap
),而其他调用者需要对象,可能有两个原因:

  • 该方法根据参数返回完全不同的内容(例如,如果设置了标志,则返回