有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java有没有办法用数据和重写的toString方法创建匿名对象数组?

Object[] x = new Object[] {"Skye", "Eyks", 123}
{
    @Override
    public String toString()
    {
        return this[0] + " " + this[1] + " (" + this[3] + ")";
    }
};

所以x.toString()将返回“Skye-Eyks(123)”

NetBeans表示它需要一个分号,这是表达式的非法开始

我之所以要使用匿名数组类,是为了在组合框中显示数据,并在用户提交表单后获取数组中的所有其他数据


共 (1) 个答案

  1. # 1 楼答案

    不,这是不可能的

    您的代码粘贴强烈建议另一种解决方案:

    Java是一种静态的、名义上类型化的面向对象语言。Java非常不擅长处理存储在异类、非类型和未命名的“未知神秘抓取包”中的数据,这就是Object[]

    这大概就是你想要的:

    public class Word {
        final String word;
        final int score;
    
        public String getWord() {
            return word;
        }
    
        public String getReverse() {
            // ... 
        }
    
        public int getScore() {
            return score;
        }
    
        @Override public String toString() {
            return word + " " + getReverse() + " (" + score + ")";
        }
    }
    

    现在,它有了结构(编译器现在知道了,你的编辑器现在可以帮你了):a WordgetWord()getReverse()这样的属性getReverse()比{}信息量大得多。现在,如果需要,您可以添加文档(您打算如何“记录”new Object[]?),而且您还有灵活性的空间(例如,getReverse()可以动态计算,而不是在构建时传递)

    现在可以编写采用Word的方法。这是:

    public void printWord(Word word) {}
    

    这几乎是不言而喻的。与此相比:

    /**
     * This function requires that you pass a 3-sized object array, with:
     * The first argument must be a string - this is the word to print.
     * The second argument must be that string, reversed. It will be printed in light grey for a mirror effect.
     * The third argument must be a boxed integer, this will be printed in the lower right corner as page number
     */
    public void printWord(Object[] o) {}
    

    这是一大堆文档,更糟糕的是:这些文档是非结构化的——而对于一个实际的类,方法的名称可以承载大部分这方面的含义,并允许您独立地记录每个片段。您还可以将任何检查和其他代码分包到正确的位置,而不是最终出现这样一种情况:检查输入数组是否正确的代码需要在许多地方调用,并且您需要不遗余力地记录所有内容,如果传递无效输入会发生什么(而在Word的构造函数中,只需这样做一次)

    如果由于外力(例如,传递给主函数的参数)而导致Object[],那么总体目标是一次性地、尽快地将其转换为适当的对象,以便java代码尽可能不受这种异构、未类型化和未命名的mysterymeat的影响

    NB:是的,这意味着你需要为所有你能想到的东西创建大量的类,所以你最终会得到干净的代码。Lombok的^{}和java15的记录都可以帮助解决这个问题