Java - 废弃方法 - 如何处理?

4
我正在跟随一系列Java教程来学习Java。我对第72篇教程有一个问题。
链接:http://www.youtube.com/watch?v=9z_8yEv7nIc&feature=relmfu 在视频的7:02处,写下了这个声明。然而,在Java 1.7中,该方法已被弃用。 RightList.setListData(LeftList.getSelectedValues()); Eclipse返回以下错误:
    Object[] javax.swing.JList.getSelectedValues()
    getSelectedValues
    @Deprecated
    public Object[] getSelectedValues()
    Deprecated. As of JDK 1.7, replaced by getSelectedValuesList()
    Returns an array of all the selected values, in increasing order based on their indices in the list.
    Returns:
    the selected values, or an empty array if nothing is selected
    See Also:
    isSelectedIndex(int), getModel(), addListSelectionListener(javax.swing.event.ListSelectionListener)

但是这会返回一个错误,错误信息为“The method setListData(Object[]) in the type JList is not applicable for the arguments (List)”。

什么才是替代上述语句的正确方式呢?


另外,我想借此机会问一个不相关的问题:在方法之外初始化变量是否更好,像这样:

    private         JList       LeftList    =   new JList();
    private         JList       RightList   =   new JList();
    private         JButton     Move        =   new JButton("Move -->");

    private static  String[]    Items       =   {"Item 1", "Item 2","Item 3","Item 4","Item 5"};

与(如视频所示):在类外声明变量,但在方法内赋值相比,哪个更好? 是否有性能上的区别?

1
你正在询问如何初始化变量,而不是声明它们。此外,这并不是“在类外”,而是在方法外。变量的初始化位置取决于它们的使用方式,通常是个人偏好的问题。除非你创建了大量变量并在创建时初始化变量而不是按需初始化,否则性能差异通常可以忽略不计。 - Dave Newton
好的,谢谢回复。我倾向于交替使用那样的术语,对任何混淆感到抱歉。不过我应该使用正确的术语,感谢提醒。=) - Deley
LeftList是什么类型的变量?它是JList吗?同时显示实际的错误消息,而不是您的解释。 - Hovercraft Full Of Eels
你正在使用Java 1.7版本!我想我最好跟上时代了! - Hovercraft Full Of Eels
是的,这是一个JList。我已经更新了问题以显示错误消息。 - Deley
3个回答

9
根据Java7的JList javadoc,我发现你没有选择的选项 - 两个API(getSelectedValuesListsetDataList)是不相关的。
要解决这个问题,一个简单的解决方案是执行LeftList.getSelectedValuesList().toArray() - 它将为setDataList提供适当的数组。免责声明:我不知道这是否是Java推荐的“正确”用法,但它应该可以工作。
此外,请注意,弃用的API并不意味着它不起作用 - 如果您觉得现在不想投入时间,您仍然可以使用旧的API(就像您正在做教程而不是未来10年将投入生产的产品)。
至于第二个问题 - 这是一种品味问题,我更喜欢在类声明中声明变量而不初始化它们,并在构造函数中设置它们的值。给常量赋初值是习惯性的(例如public static final String AAA =“XYZ”;)。

那个很好用,除了一个类型错误,我不太担心。再次感谢大家,我会尽量使用适当的样式约定。我希望我能接受你们所有人的答案,但我不能。 =) - Deley
很棒的解决方案。我也遇到了完全相同的问题。 - skiabox

3
你需要更新setListData方法以接受新的参数类型(以及任何其他代码,其中包括期望Object[]的方法、可能遍历数组的内容等)。然而,仅因为某些东西已被弃用并不意味着它已被移除。
你的下一步取决于你的目标:是学习材料还是学习材料并且更新所有源代码以避免警告。

好的,我正在查看智能感知菜单,但找不到其他可以转换对象数组的选项。我应该只是创建一个方法来完成同样的事情吗?是的,编译时没有警告会更有益。然而,我不理解它们,例如(JList是原始类型。对泛型类型JList <E>的引用应该进行参数化)。谢谢。 - Deley
不,你需要更改你的方法(即教程代码),使用替换了已弃用方法的返回值类型。再次强调,这取决于你的目标:在我看来,试图重写代码、学习材料并将范型加入其中是一项艰巨的任务。先选择一个重点,然后再去做其余的事情。 - Dave Newton
好的,也许我正在试图做出不必要的更改。我会记住那个建议的。感谢您的意见。 - Deley

2
我看了一下相关的教程。
关于API的问题,你需要按照以下步骤进行:
rightList.setListData(leftList.getSelectedValuesList().toArray());

PS:关于风格的一些提示。在Java中,变量通常以小写字母开头,而类名则以大写字母开头。在您上面的代码中,我看到您试图在一个类上调用静态方法,因此您可能需要将名称更改为小写。


啊,谢谢。现在它可以工作了,只是给我一个关于类型的错误,但我很乐意忽略它。我会记住这个样式提示,因为遵循正确的约定可能比我的更重要。=) - Deley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接