Java - 已弃用的方法 - 该怎么办?

问题描述:

我正在学习一系列Java教程。我有一个关于教程的问题72.Java - 已弃用的方法 - 该怎么办?

链接: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) 

但这返回一个错误说“的方法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

你在问初始化*变量,而不是*声明*它们。此外,这不是“课外”,而是一种方法。初始化*变量的位置取决于它们的使用方式,通常是一种偏好问题。性能差异通常可以忽略不计,除非您创建*巨大数量的数字并在创建时初始化变量,而不是根据需要进行初始化。 –

+0

好的,谢谢你的回复。我倾向于交替使用这样的术语,对于任何混淆抱歉。我应该使用正确的术语,谢谢提醒。 =) – Deley

+0

'LeftList'是什么类型的变量?它是JList吗?同时显示实际的错误信息,而不是你对它的解释。 –

根据JList的javadoc Java7我看到你确实没有别的选择 - 这两种API(getSelectedValuesListsetDataList)无关。

要解决这个问题,一个简单的解决方案是执行LeftList.getSelectedValuesList().toArray() - 它将为您提供一个适合于setDataList的阵列。免责声明:我不知道这是否是Java推荐的“正确”用法,但它应该起作用。另外,请注意,不赞成使用的API并不意味着它不起作用 - 如果您觉得现在不想投入时间,那么仍然可以使用旧的API(例如在您的情况下做一个教程,而不是一些正在进行的产品,将在未来10年的生产)

至于第二个问题 - 这是一个味道的问题,我更喜欢声明变量,而不需要在类声明和设置中初始化它们他们与构造函数中的值。习惯上给常量赋初值(例如public static final String AAA = "XYZ";

+0

除了我不关心的类型错误之外,这很好用。再次,我会尝试使用适当的样式约定。谢谢大家。我希望我能接受你所有的答案,但我不能。 =) – Deley

+0

伟大的解决方案。我偶然发现了同样的问题。 – skiabox

你需要更新setListData方法采取新的参数类型(以及所期待的Object[],包括迭代这个数组方法,可能事情任何其他代码等),仅仅因为一些已经过时没有按这并不意味着删除,但。

要做什么取决于您的直接目标:是学习材料还是学习材料更新所有源以编译时不带警告。

+0

好吧,我正在浏览智能感应菜单,但找不到其他任何东西转动对象数组。我应该创建一个方法来做同样的事情吗?是的,编译时不需要警告是有益的。但是,我不明白他们,例如(JList是一个原始类型,对泛型JList 的引用应该被参数化)。谢谢。 – Deley

+0

不,您需要更改* your *方法(即教程代码)以使用替换已弃用方法的方法的返回值类型。再次,它取决于你的目标:IMO试图重写代码*并且*学习材料*和*将泛型扔到混合中是一团糟。选择一些东西,首先关注它,然后完成剩下的事情。 –

+0

好的,也许我正在尝试做出不必要的更改。我会牢记这个建议。感谢您的输入。 – Deley

我看了一下有问题的教程。

你对API的问题,你需要做到以下几点:

rightList.setListData(leftList.getSelectedValuesList().toArray()); 

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

+0

啊,谢谢。它现在有效,只给我一个关于类型的错误,我很高兴忽略它。我会牢记样式提示,因为按照适当的约定比我自己的约定更重要。 =) – Deley