在这里,我试图使用内部静态助手类为我的数据库连接实现单例类:
package com.myapp.modellayer;
public class DatabaseConnection {
private DatabaseConnection() {
//JDBC code...
}
private static class ConnectionHelper {
// Instantiating the outer class
private static final DatabaseConnection INSTANCE = new DatabaseConnection();
}
public static DatabaseConnection getInstance() {
return ConnectionHelper.INSTANCE;
}
}
Run Code Online (Sandbox Code Playgroud)
但是,我怀疑这个静态内部类ConnectionHelper何时被加载到JVM内存中:
在加载DatabaseConnection类时,还是在调用getInstance()方法时?
如果两个对象引用指向同一个可序列化的对象,那么在java中序列化期间会发生什么?Serializable对象是否会保存两次?
例如 :
class King implements java.io.Serializable {
private String name="Akbar";
}
class Kingdom implements java.io.Serializable {
King goodKing=new King();
King badKing=goodKing;
}
public class TestSerialization {
public static void serializeObject(String outputFileName,
Object serializableObject) throws IOException {
FileOutputStream fileStream=new FileOutputStream(outputFileName);
ObjectOutputStream outStream=new ObjectOutputStream(fileStream);
outStream.writeObject(serializableObject);
outStream.close();
}
public static void main(String[] args) {
Kingdom kingdom=new Kingdom();
try {
TestSerialization.serializeObject("Kingdom1.out", kingdom);
}catch(IOException ex) {
ex.getMessage();
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在,是否只为goodKing和badKing参考保存了一个对象状态,或者King对象被保存了两次?
public class Test {
public static void main(String str[]) {
Hello h=Hello.INS1;
}
}
class Hello {
static Hello INS1=new Hello();
static Hello INS2=new Hello(12);
{
System.out.println("Instance Block");
}
static {
System.out.println("Static Block");
}
private Hello() {
System.out.println("Hello() Block");
}
private Hello(int ab) {
System.out.println("Hello() Block");
}
}
Run Code Online (Sandbox Code Playgroud)
静态块总是先执行,但这段代码给出了一些我无法确定的东西。这里究竟发生了什么......?
输出:实例块 Hello() 块实例块 Hello() 块静态块
这是我的servlet类,它负责从HTML页面获取数据并将该数据存储在WEB-INF目录下的EmailList.txt文件中:
Servlet类的代码片段......
//Get Parameters from the request object
String firstName=request.getParameter("firstName");
String lastName=request.getParameter("lastName");
String emailId=request.getParameter("emailId");
//Get a relative file name
ServletContext context=getServletContext();
String path=context.getRealPath("WEB-INF/EmailList.txt");
//Use Regular Java object to write the data to the file
UserData userData=new UserData(firstName, lastName, emailId);
UserIO.addUser(userData, path);
Run Code Online (Sandbox Code Playgroud)
其中的UserData是一个普通的Java类setter方法和getter方法,以及UserIO包含代码的内容写入到文件EmailList.txt
UserIO类的代码如下:
public class UserIO {
public static void addUser(UserData userData,
String filePath)
throws IOException {
File file=new File(filePath);
PrintWriter out=new PrintWriter(new FileWriter(file, true));
out.println(userData.getFirstName()+"\t"
+ userData.getLastName()+"\t"
+ userData.getEmailId()); …
Run Code Online (Sandbox Code Playgroud)