Java มีคำสั่งการใช้งานที่สามารถใช้เมื่อเปิดเซสชันในโหมดไฮเบอร์เนตหรือไม่?
ใน C # เป็นสิ่งที่ชอบ:
using (var session = new Session())
{
}
ดังนั้นวัตถุจึงอยู่นอกขอบเขตและปิดโดยอัตโนมัติ
Java มีคำสั่งการใช้งานที่สามารถใช้เมื่อเปิดเซสชันในโหมดไฮเบอร์เนตหรือไม่?
ใน C # เป็นสิ่งที่ชอบ:
using (var session = new Session())
{
}
ดังนั้นวัตถุจึงอยู่นอกขอบเขตและปิดโดยอัตโนมัติ
using statement
.
using
มันจะกำจัดวัตถุโดยอัตโนมัติเมื่อสิ้นสุดขอบเขต แต่ไม่ได้ยกเลิกการจัดสรรวัตถุ - อายุการใช้งานจะไม่สิ้นสุดจนกว่าการอ้างอิงทั้งหมดจะหายไป
คำตอบ:
Java 7 เปิดตัวAutomatic Resource Block Managementซึ่งนำคุณสมบัตินี้มาสู่แพลตฟอร์ม Java Java เวอร์ชันก่อนหน้าไม่มีอะไรที่คล้ายusing
กัน
ตัวอย่างเช่นคุณสามารถใช้ตัวแปรใดก็ได้java.lang.AutoCloseable
ในการดำเนินการดังต่อไปนี้:
try(ClassImplementingAutoCloseable obj = new ClassImplementingAutoCloseable())
{
...
}
java.io.Closeable
อินเทอร์เฟซของ Java ที่ใช้งานโดยสตรีมขยายโดยอัตโนมัติAutoCloseable
ดังนั้นคุณสามารถใช้สตรีมในtry
บล็อกแบบเดียวกับที่คุณใช้ในusing
บล็อกC # ซึ่งเทียบเท่ากับ C #using
's
ในเวอร์ชัน 5.0 ไฮเบอร์เนตเซสชันจะใช้งานAutoCloseable
และสามารถปิดอัตโนมัติในบล็อก ARM ในรุ่นก่อนหน้า Hibernate เซสชันไม่ได้ดำเนินการ AutoCloseable
ดังนั้นคุณจะต้องอยู่ในโหมดไฮเบอร์เนต> = 5.0 เพื่อใช้คุณสมบัตินี้
using
ทำ)
AutoCloseable
ดังนั้นจึงยังใช้ ARM ไม่ได้
AutoCloseable
ไม่มีมาก่อน java 7 หรือเปล่า?
ก่อน Java 7มีไม่มีคุณสมบัติดังกล่าวในชวา (สำหรับ Java 7 ขึ้นไปดูAsaphคำตอบ 'sเกี่ยวกับARM )
คุณต้องทำด้วยตนเองและมันเป็นความเจ็บปวด :
AwesomeClass hooray = null;
try {
hooray = new AwesomeClass();
// Great code
} finally {
if (hooray!=null) {
hooray.close();
}
}
และนี่เป็นเพียงรหัสเมื่อค่า// Great code
มิได้hooray.close()
สามารถโยนข้อยกเว้นใด ๆ
หากคุณต้องการ จำกัด ขอบเขตของตัวแปรจริงๆบล็อกโค้ดธรรมดาจะทำงาน:
{
AwesomeClass hooray = new AwesomeClass();
// Great code
}
แต่นั่นอาจไม่ใช่สิ่งที่คุณหมายถึง
// Great code
มีข้อยกเว้น
horray
อาจไม่ได้เริ่มต้น ณ จุดนั้น (แก้ไขแล้ว)
ตั้งแต่ Java 7 มันทำ: http://blogs.oracle.com/darcy/entry/project_coin_updated_arm_spec
ไวยากรณ์ของรหัสในคำถามจะเป็น:
try (Session session = new Session())
{
// do stuff
}
โปรดทราบว่าSession
จำเป็นต้องใช้AutoClosable
หรือหนึ่งในอินเทอร์เฟซย่อย (หลายรายการ)
ในทางเทคนิค:
DisposableObject d = null;
try {
d = new DisposableObject();
}
finally {
if (d != null) {
d.Dispose();
}
}
เทียบเท่ากับ java ที่ใกล้เคียงที่สุดคือ
AwesomeClass hooray = new AwesomeClass();
try{
// Great code
} finally {
hooray.dispose(); // or .close(), etc.
}
ณ ตอนนี้ยังไม่มี
อย่างไรก็ตามมีข้อเสนอของARMสำหรับ Java 7
หากคุณสนใจในการจัดการทรัพยากรProject Lombokขอเสนอ@Cleanup
คำอธิบายประกอบ ถ่ายโดยตรงจากเว็บไซต์ของพวกเขา:
คุณสามารถใช้
@Cleanup
เพื่อให้แน่ใจว่าทรัพยากรที่กำหนดจะถูกล้างโดยอัตโนมัติก่อนที่เส้นทางการเรียกใช้โค้ดจะออกจากขอบเขตปัจจุบันของคุณ คุณทำได้โดยใส่คำอธิบายประกอบการประกาศตัวแปรภายในด้วย@Cleanup
คำอธิบายประกอบดังนี้:
@Cleanup InputStream in = new FileInputStream("some/file");
ดังนั้นในตอนท้ายของขอบเขตที่คุณอยู่จะ
in.close()
ถูกเรียกว่า สายนี้รับประกันว่าจะดำเนินการโดยการลอง / สร้างในที่สุด ดูตัวอย่างด้านล่างเพื่อดูวิธีการทำงานหากประเภทของออบเจ็กต์ที่คุณต้องการล้างไม่มี
close()
เมธอด แต่มีวิธีการอื่นที่ไม่มีอาร์กิวเมนต์คุณสามารถระบุชื่อของเมธอดนี้ได้ดังนี้:
@Cleanup("dispose") org.eclipse.swt.widgets.CoolBar bar = new CoolBar(parent, 0);
close()
โดยค่าเริ่มต้นวิธีการทำความสะอาดที่มีการสันนิษฐานว่าเป็น@Cleanup
วิธีการทำความสะอาดที่ใช้อาร์กิวเมนต์ไม่สามารถเรียกว่าผ่าน
วานิลลาชวา
import java.io.*;
public class CleanupExample {
public static void main(String[] args) throws IOException {
InputStream in = new FileInputStream(args[0]);
try {
OutputStream out = new FileOutputStream(args[1]);
try {
byte[] b = new byte[10000];
while (true) {
int r = in.read(b);
if (r == -1) break;
out.write(b, 0, r);
}
} finally {
out.close();
}
} finally {
in.close();
}
}
}
กับเกาะลอมบอก
import lombok.Cleanup;
import java.io.*;
public class CleanupExample {
public static void main(String[] args) throws IOException {
@Cleanup InputStream in = new FileInputStream(args[0]);
@Cleanup OutputStream out = new FileOutputStream(args[1]);
byte[] b = new byte[10000];
while (true) {
int r = in.read(b);
if (r == -1) break;
out.write(b, 0, r);
}
}
}
ใน java 8 คุณสามารถใช้ลอง โปรดดูหน้าต่อไปนี้ http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html
โปรดดูรายการคีย์เวิร์ด Javaนี้
using
คำหลักที่เป็นที่น่าเสียดายไม่เป็นส่วนหนึ่งของรายการusing
คีย์เวิร์ดC # ผ่านคีย์เวิร์ดอื่น ๆ สำหรับตอนนี้ใน Javaที่จะเลียนแบบเช่น"using"
พฤติกรรมที่คุณจะต้องใช้บล็อกที่คุณจะทิ้งของทรัพยากรภายในtry...catch...finally
finally
using
ไม่ใช่คีย์เวิร์ดไม่ได้หมายถึงสิ่ง คุณลักษณะเดียวกันนี้สามารถนำไปใช้ (และจะ!) ด้วยคำหลักอื่นตามที่ @BalusC กล่าวถึง
using
ไม่อยู่ในรายการคีย์เวิร์ด Java หมายความว่าคุณลักษณะนี้ไม่มีอยู่ในภาษา Java และนั่นไม่เป็นความจริง
using
คีย์เวิร์ดและไม่มีความเท่าเทียมใด ๆ ในตอนนี้ ขอบคุณ @Joachim Sauer! =)
บล็อก ARMจากproject coinจะอยู่ใน Java 7 ซึ่งเป็นคุณลักษณะนี้มีไว้เพื่อนำฟังก์ชันการทำงานที่คล้ายคลึงกับ Java มาใช้เป็น. Net โดยใช้ไวยากรณ์
เพื่อตอบคำถามเกี่ยวกับการ จำกัด ขอบเขตของตัวแปรแทนที่จะพูดถึงการปิด / กำจัดตัวแปรโดยอัตโนมัติ
ใน Java คุณสามารถกำหนดขอบเขตแบบปิดและไม่ระบุชื่อโดยใช้วงเล็บปีกกา มันง่ายมาก
{
AwesomeClass hooray = new AwesomeClass()
// Great code
}
ตัวแปรhooray
สามารถใช้ได้เฉพาะในขอบเขตนี้และไม่อยู่นอกตัวแปร
สิ่งนี้จะมีประโยชน์หากคุณมีตัวแปรซ้ำซึ่งเป็นเพียงชั่วคราว
ตัวอย่างเช่นแต่ละรายการมีดัชนี เช่นเดียวกับitem
ตัวแปรที่ปิดอยู่บน for loop (กล่าวคือใช้ได้เฉพาะภายใน) index
ตัวแปรจะถูกปิดในขอบเขตที่ไม่ระบุตัวตน
// first loop
{
Integer index = -1;
for (Object item : things) {index += 1;
// ... item, index
}
}
// second loop
{
Integer index = -1;
for (Object item : stuff) {index += 1;
// ... item, index
}
}
ฉันยังใช้สิ่งนี้ในบางครั้งหากคุณไม่มี for loop เพื่อระบุขอบเขตตัวแปร แต่คุณต้องการใช้ชื่อตัวแปรทั่วไป
{
User user = new User();
user.setId(0);
user.setName("Andy Green");
user.setEmail("andygreen@gmail.com");
users.add(user);
}
{
User user = new User();
user.setId(1);
user.setName("Rachel Blue");
user.setEmail("rachelblue@gmail.com");
users.add(user);
}
using
ทำ ขอบเขตไม่ใช่อายุการใช้งาน (และusing
ไม่เกี่ยวกับอายุการใช้งานด้วยพูดอย่างเคร่งครัดเนื่องจากDispose
ไม่ทำลายความทรงจำของวัตถุ)