代码之家  ›  专栏  ›  技术社区  ›  Manuel Selva

创建单例数组的最佳方法

  •  34
  • Manuel Selva  · 技术社区  · 14 年前

    在Java中创建单元素(恰好有一个元素)对象数组的“最简单”方法是什么?

    6 回复  |  直到 6 年前
        1
  •  33
  •   aioobe    14 年前
    Object [] singleton = { new SomeObject() };
    
        2
  •  15
  •   Community miroxlav    7 年前

    标准方法是:

    String[] arr = new String[]{"I am the one and only"};
    

    恐怕不会比这简单得多。

    编辑:它:

    String[] arr = {"I am the one and only"};
    

    谢谢,我一直忘了这个。


    当然,如果您经常创建数组,您可以创建一个帮助器方法,使事情变得简单一点:

    public static <T> T[] asArray(T... items){
        return items;
    }
    
    String[] arr = asArray("I am the one and only");
    

    (但是您不能在编译时强制它是一个只有一个元素的数组)


    接下来我要写一个单例数组方法,但是 Stephen beat me to that .

        3
  •  5
  •   卢声远 Shengyuan Lu    14 年前

    枚举解决方案(反反射攻击):

    enum MySingleton{
        INSTANCE(new String[]{"a","b"});
    
        final String[] values;
    
        private MySingleton(String[] values) {
            this.values = values;
        }
    }
    

    参考如下:

    MySingleton.INSTANCE;
    
        4
  •  4
  •   Pedro Oliveira    9 年前

    这应该能完成任务

    public SomeType[] makeSingletonArray(SomeType elem) {
        return new SomeType[]{elem};
    }
    

    这个方法的一般版本使用起来有点笨拙,因为您需要将它传递给 Class 对象作为附加参数。

    内联 SomeType[]{elem} 表达式更简单,这就是我通常要做的。

        5
  •  3
  •   Yoory N. jmcg    6 年前

    如果您的项目已经在使用ApacheCommonsLib,那么您可以坚持 ArrayUtils.toArray() 方法。

    String[] arr = ArrayUtils.toArray("The string");
    // or if using static import
    String[] arr = toArray("The string");
    

    即使使用静态导入,它仍然比接受的答案更详细:

    String[] arr = {"The string"};
    

    但当不允许使用紧凑数组初始值设定项语法时,它非常方便。

    一些例子:

    someMethod(toArray("The string"), /* other params */);
    
    return toArray("The string");
    
    @DataProvider
    public Object[][] someDataProvider() {
        return rangeClosed(-12, +12)
            .map(HOURS::toMillis).boxed()
            .map(ArrayUtils::toArray)
            .toArray(Object[][]::new);
    }
    

    你可以自己想象其他的例子。

    还要注意的是, arrayutils.toarray()。 可以将任意数量的对象包装到数组中,而不仅仅是单个对象。

        6
  •  2
  •   Nate W.    14 年前

    你可以这样做:

    String[] a = Collections. singletonList ("SingleElement").toArray();

    编辑: 哎哟!上面的示例无法编译。如注释所述,这可以通过以下方式完成:

    Object[] a = Collections.singletonList("SingleElement").toArray();

    String[] a = Collections.singletonList("SingleElement").toArray(new String[1]);