Java最终数组列表
我的问题是关于将arraylist声明为最终列表。我知道一旦我写了finalJava最终数组列表,java,Java,我的问题是关于将arraylist声明为最终列表。我知道一旦我写了finalArrayList list=new ArrayList()我可以在此列表中添加或删除对象,但我不能list=new ArrayList()或list=list1。但是将arraylist声明为 Private static final ArrayList list=new ArrayList()。除了我上面提到的区别之外,以下两种声明之间还有什么区别: 1. ArrayList list = new ArrayList
ArrayList list=new ArrayList()
我可以在此列表中添加或删除对象,但我不能list=new ArrayList()
或list=list1
。但是将arraylist声明为
Private static final ArrayList list=new ArrayList()代码>。除了我上面提到的区别之外,以下两种声明之间还有什么区别:
1. ArrayList list = new ArrayList()
2. private static final ArrayList list = new ArrayList();
你说“我可以添加、删除(和查找)对象”,但谁是I
这两种情况的不同之处在于可以从哪些代码调用这些列表操作
一般来说,您需要考虑声明的范围,如果您减少变量的可见性,则大大提高代码的可维护性。如果您有课程:
Public Class MyThing {
public int importantValue;
// more code
}
该重要值可以由应用程序中的任何其他代码更改。如果您将其设置为私有并提供读取访问器:
Public Class MyThing {
private int importantValue;
public int getImportantValue(){
return importantValue;
}
// more code
}
您现在知道,只有类本身可以更改值—对于大型应用程序,这将大大提高可维护性。因此,声明列表私有将限制代码可以看到的内容,并更改列表的内容
使用static使类的所有实例共享列表,而不是每个实例都获得其ovn副本。您是对的,声明列表
final意味着您不能将列表
变量重新分配给另一个对象
另一个问题(我想)是
vs
让我们依次使用每个修饰符
private
表示只有这个类(SomeClass
)可以访问列表
static
意味着列表
变量只有一个实例可供SomeClass
的所有实例共享。列表实例与SomeClass类关联,而不是与每个新的SomeClass实例关联。如果一个变量是非静态的,则称之为实例变量
final
如您所知,这意味着您无法将列表变量重新赋值
在第二个声明中没有修饰符,因此该变量是一个实例变量,它还获得包私有访问保护(有时称为默认访问保护)。这意味着这个类(SomeClass
)和同一个包中的其他类可以访问变量
您可以在此处找到有关公共
、私有
和包私有
的更多信息:
你可以在这里找到更多关于final
和static
的信息:
final ArrayList list = new ArrayList();
这意味着变量list
将始终指向同一ArrayList
对象。在两种情况下,这可能很有用
您希望确保在变量收到其值后,没有人重新分配列表
变量。这可以降低复杂性,并有助于理解类/方法的语义。在这种情况下,通过使用良好的命名约定和减少方法长度(类/方法已经太复杂,不容易理解),通常情况下会更好
使用内部类时需要在封闭范围中将变量声明为final
,以便在内部类中访问它们。通过这种方式,Java可以将final
变量复制到内部类对象中(它永远不会更改其值),内部类对象不需要担心外部类对象在内部类对象处于活动状态时会发生什么,并且需要访问该变量的值
你问题的第二部分是关于
ArrayList list = new ArrayList();
及
当然,不同之处在于修饰符private
表示在类外不可见,static
表示它是在类级别定义的,不需要实例就可以存在,final
如上所述。没有修饰语意味着。只是为了“给你的工厂带一点水”,当你想让你的列表公开但不可修改时,你会理解最终版的兴趣
在java中,可以使列表不可修改
现在查看以下代码:
public class MyClass{
public static List<String> MY_PUBLIC_LIST;
static{
ArrayList<String> tmp = new ArrayList<String>();
tmp.add("a");
tmp.add("b");
tmp.add("c");
MY_PUBLIC_LIST = tmp;
}
}
但您仍然可以修改列表的内容:
MyClass.MY_PUBLIC_LIST.clear();
MyClass.MY_PUBLIC_LIST.add("1");
通过在静态块的末尾添加一个
MY_PUBLIC_LIST = Collections.unmodifiableList(tmp);
好的,我们快到了。为了确保你得到了完整的图片,让我们保留,但让我删除最后的修改器
public class MyClass{
public static List<String> MY_PUBLIC_LIST;
static{
ArrayList<String> tmp = new ArrayList<String>();
tmp.add("a");
tmp.add("b");
tmp.add("c");
MY_PUBLIC_LIST = Collections.unmodifiableList(tmp);
}
}
公共类MyClass{
公共静态列表我的公共列表;
静止的{
ArrayList tmp=新的ArrayList();
tmp.添加(“a”);
tmp.添加(“b”);
tmp.添加(“c”);
MY_PUBLIC_LIST=集合。不可修改列表(tmp);
}
}
在那种情况下你能做什么
在第一种情况下,您可以做任何您想做的事情(假设您首先分配了新列表):
MyClass.MY\u PUBLIC\u LIST=null;
MyClass.MY_PUBLIC_LIST=新建ArrayList();
MyClass.MY_PUBLIC_LIST.clear();
MyClass.MY_PUBLIC_LIST.add(“1”);
您似乎在寻求澄清实例变量和静态变量之间的区别。如果情况并非如此,请进一步澄清。
MyClass.MY_PUBLIC_LIST = null;
MyClass.MY_PUBLIC_LIST = new ArrayList<String>();
MyClass.MY_PUBLIC_LIST.clear();
MyClass.MY_PUBLIC_LIST.add("1");
public static final List<String> MY_PUBLIC_LIST;
MyClass.MY_PUBLIC_LIST.clear();
MyClass.MY_PUBLIC_LIST.add("1");
MY_PUBLIC_LIST = Collections.unmodifiableList(tmp);
public class MyClass{
public static List<String> MY_PUBLIC_LIST;
static{
ArrayList<String> tmp = new ArrayList<String>();
tmp.add("a");
tmp.add("b");
tmp.add("c");
MY_PUBLIC_LIST = Collections.unmodifiableList(tmp);
}
}
MyClass.MY_PUBLIC_LIST = null;
MyClass.MY_PUBLIC_LIST = new ArrayList<String>();
MyClass.MY_PUBLIC_LIST.clear();
MyClass.MY_PUBLIC_LIST.add("1");