C # के हिडन फीचर्स को पढ़ने के बाद मैंने सोचा कि जावा के कुछ छिपे हुए फीचर्स क्या हैं?
C # के हिडन फीचर्स को पढ़ने के बाद मैंने सोचा कि जावा के कुछ छिपे हुए फीचर्स क्या हैं?
जवाबों:
डबल ब्रेस इनिशियलाइज़ेशन ने मुझे कुछ महीने पहले आश्चर्यचकित कर दिया जब मैंने पहली बार इसकी खोज की, इसके बारे में पहले कभी नहीं सुना।
थ्रेडलोकल को आमतौर पर व्यापक रूप से प्रति-थ्रेड स्थिति को संग्रहीत करने के तरीके के रूप में नहीं जाना जाता है।
चूँकि JDK 1.5 जावा में बहुत अच्छी तरह से लागू किया गया है और सिर्फ ताले से परे मजबूत संगामिति उपकरण हैं, वे java.util.concurrent में रहते हैं और एक विशेष रूप से दिलचस्प उदाहरण java.util.concurrent.atomic उप-पैकेज है जो थ्रेड-सुरक्षित प्राइमेटिव है जो तुलना को लागू करता है। -और-स्वैप ऑपरेशन और इन ऑपरेशन के वास्तविक देशी हार्डवेयर समर्थित संस्करणों के लिए मैप कर सकते हैं।
संयुक्त संघ प्रकार पैरामीटर विचरण में:
public class Baz<T extends Foo & Bar> {}
उदाहरण के लिए, यदि आप एक पैरामीटर लेना चाहते हैं जो तुलनात्मक और संग्रह दोनों है:
public static <A, B extends Collection<A> & Comparable<B>>
boolean foo(B b1, B b2, A a) {
return (b1.compareTo(b2) == 0) || b1.contains(a) || b2.contains(a);
}
यदि दो दिए गए संग्रह समान हैं या यदि उनमें से किसी एक में दिए गए तत्व हैं, तो यह गलत है या नहीं तो यह विरोधाभासी तरीका सही है। ध्यान देने वाली बात यह है कि आप तर्कों और संग्रह दोनों की विधियों को b1 और b2 पर लागू कर सकते हैं।
मैं उदाहरण के शुरुआती दिनों से हैरान था। मैं कुछ कोड-आधारित विधियों को हटा रहा था और कई उदाहरण इनिशियलाइज़र बना रहा था:
public class App {
public App(String name) { System.out.println(name + "'s constructor called"); }
static { System.out.println("static initializer called"); }
{ System.out.println("instance initializer called"); }
static { System.out.println("static initializer2 called"); }
{ System.out.println("instance initializer2 called"); }
public static void main( String[] args ) {
new App("one");
new App("two");
}
}
निष्पादन mainविधि प्रदर्शित होगी:
static initializer called
static initializer2 called
instance initializer called
instance initializer2 called
one's constructor called
instance initializer called
instance initializer2 called
two's constructor called
मुझे लगता है कि ये उपयोगी होगा यदि आपके पास कई कंस्ट्रक्टर थे और उन्हें सामान्य कोड की आवश्यकता थी
वे आपकी कक्षाओं को आरंभीकृत करने के लिए सिंटैक्टिक शुगर भी प्रदान करते हैं:
List<Integer> numbers = new ArrayList<Integer>(){{ add(1); add(2); }};
Map<String,String> codes = new HashMap<String,String>(){{
put("1","one");
put("2","two");
}};
JDK 1.6_07 + में VisualVM (बिन / jvisualvm.exe) नामक एक ऐप शामिल है, जो कई टूल्स के ऊपर एक अच्छा GUI है। यह JConsole की तुलना में अधिक व्यापक लगता है।
जावा 6 के बाद से क्लासपैथ वाइल्ड कार्ड।
java -classpath ./lib/* so.Main
के बजाय
java -classpath ./lib/log4j.jar:./lib/commons-codec.jar:./lib/commons-httpclient.jar:./lib/commons-collections.jar:./lib/myApp.jar so.Main
Http://java.sun.com/javase/6/docs/technotes/tools/windows/classp.html.html देखें
ज्यादातर लोगों के लिए मैं जावा डेवलपर पदों के लिए साक्षात्कार देता हूं लेबल वाले ब्लॉक बहुत आश्चर्यचकित करते हैं। यहाँ एक उदाहरण है:
// code goes here
getmeout:{
for (int i = 0; i < N; ++i) {
for (int j = i; j < N; ++j) {
for (int k = j; k < N; ++k) {
//do something here
break getmeout;
}
}
}
}
gotoजावा में किसने कहा कि यह केवल एक खोजशब्द है? :)
जेडीके 1.5 के बाद से सहसंयोजक वापसी प्रकार के बारे में कैसे ? यह बहुत खराब प्रचारित है, क्योंकि यह एक अलौकिक जोड़ है, लेकिन जैसा कि मैं इसे समझता हूं, जेनरिक के लिए काम करना नितांत आवश्यक है।
अनिवार्य रूप से, संकलक अब एक उपवर्ग को ओवरराइड विधि के रिटर्न प्रकार को मूल विधि के रिटर्न प्रकार के उपवर्ग के रूप में संकीर्ण करने की अनुमति देता है। तो यह अनुमति है:
class Souper {
Collection<String> values() {
...
}
}
class ThreadSafeSortedSub extends Souper {
@Override
ConcurrentSkipListSet<String> values() {
...
}
}
आप उपवर्ग के कॉल कर सकते हैं valuesविधि और एक क्रमबद्ध धागा सुरक्षित प्राप्त Setकी Stringरों नीचे डाली बिना करने के लिए ConcurrentSkipListSet।
अंत में ब्लॉक में नियंत्रण का हस्तांतरण किसी भी अपवाद को दूर फेंकता है। निम्न कोड RuntimeException को नहीं फेंकता है - यह खो गया है।
public static void doSomething() {
try {
//Normally you would have code that doesn't explicitly appear
//to throw exceptions so it would be harder to see the problem.
throw new RuntimeException();
} finally {
return;
}
}
से http://jamesjava.blogspot.com/2006/03/dont-return-in-finally-clause.html
किसी को भी इस तरह से लागू होने का उल्लेख नहीं देखा गया है कि अशक्त के लिए जाँच आवश्यक नहीं है।
के बजाय:
if( null != aObject && aObject instanceof String )
{
...
}
महज प्रयोग करें:
if( aObject instanceof String )
{
...
}
freeing या deleteing से पहले null के लिए जाँच करना क्या बदतर है । ऐसी मौलिक अवधारणा।
Enums में अनुमति देने के तरीकों और निर्माणकर्ताओं ने मुझे आश्चर्यचकित किया। उदाहरण के लिए:
enum Cats {
FELIX(2), SHEEBA(3), RUFUS(7);
private int mAge;
Cats(int age) {
mAge = age;
}
public int getAge() {
return mAge;
}
}
यहां तक कि आपके पास "निरंतर विशिष्ट वर्ग निकाय" हो सकता है जो विशिष्ट एनम मान को विधियों को ओवरराइड करने की अनुमति देता है।
अधिक प्रलेखन यहाँ ।
mAgeअंतिम होना चाहिए। एनमों में गैर-अंतिम फेल्ड्स के लिए शायद ही कोई कारण हो।
जेनेरिक विधियों के प्रकार को स्पष्ट रूप से निर्दिष्ट किया जा सकता है:
Collections.<String,Integer>emptyMap()
public static <T> T foo(T t)। फिर आप कॉल कर सकते हैंClass.<Type>foo(t);
return set1.equals(set2) ? new ArrayList<String>(set1) : Collections.<String>emptyList()। यह कुछ विधि चालानों के लिए भी उपयोगी है जहाँ एक साधारण संग्रह .emptyMap () संकलन त्रुटि देगा।
इंटरफ़ेस लागू करने के लिए आप एनम का उपयोग कर सकते हैं।
public interface Room {
public Room north();
public Room south();
public Room east();
public Room west();
}
public enum Rooms implements Room {
FIRST {
public Room north() {
return SECOND;
}
},
SECOND {
public Room south() {
return FIRST;
}
}
public Room north() { return null; }
public Room south() { return null; }
public Room east() { return null; }
public Room west() { return null; }
}
संपादित करें: वर्षों बाद ...।
मैं यहाँ इस सुविधा का उपयोग करता हूँ
public enum AffinityStrategies implements AffinityStrategy {
एक इंटरफ़ेस का उपयोग करके, डेवलपर्स अपनी रणनीतियों को परिभाषित कर सकते हैं। एक enumसाधन का उपयोग करके मैं लोगों में निर्मित एक संग्रह (पांच में से) को परिभाषित कर सकता हूं।
Java 1.5 के रूप में, Java में अब वेरिएबल एरिटी के फंक्शन्स को लिखने के लिए बहुत अधिक क्लीनर सिंटैक्स है। इसलिए, केवल एक सरणी पास करने के बजाय, अब आप निम्नलिखित कार्य कर सकते हैं
public void foo(String... bars) {
for (String bar: bars)
System.out.println(bar);
}
बार स्वचालित रूप से निर्दिष्ट प्रकार के सरणी में परिवर्तित हो जाते हैं। एक बड़ी जीत नहीं, लेकिन फिर भी एक जीत।
मेरा पसंदीदा: सभी थ्रेड स्टैक के निशान को मानक रूप से डंप करें।
windows: CTRL- Breakआपके जावा cmd / कंसोल विंडो में
यूनिक्स: kill -3 PID
Breakकुंजी है।
कुछ लोगों ने उदाहरण इनिशियलाइज़र के बारे में पोस्ट किया है, यहाँ इसके लिए एक अच्छा उपयोग है:
Map map = new HashMap() {{
put("a key", "a value");
put("another key", "another value");
}};
यदि आप किसी त्वरित और सरल कार्य को कर रहे हैं तो मानचित्रों को आरंभ करने का एक त्वरित तरीका है।
या इसका उपयोग एक त्वरित स्विंग फ्रेम प्रोटोटाइप बनाने के लिए किया जाता है:
JFrame frame = new JFrame();
JPanel panel = new JPanel();
panel.add( new JLabel("Hey there"){{
setBackground(Color.black);
setForeground( Color.white);
}});
panel.add( new JButton("Ok"){{
addActionListener( new ActionListener(){
public void actionPerformed( ActionEvent ae ){
System.out.println("Button pushed");
}
});
}});
frame.add( panel );
बेशक इसका दुरुपयोग किया जा सकता है:
JFrame frame = new JFrame(){{
add( new JPanel(){{
add( new JLabel("Hey there"){{
setBackground(Color.black);
setForeground( Color.white);
}});
add( new JButton("Ok"){{
addActionListener( new ActionListener(){
public void actionPerformed( ActionEvent ae ){
System.out.println("Button pushed");
}
});
}});
}});
}};
गतिशील परदे के पीछे (1.3 में जोड़ा गया) आपको रनटाइम पर एक नए प्रकार को परिभाषित करने की अनुमति देता है जो एक इंटरफ़ेस के अनुरूप है। यह समय की एक आश्चर्यजनक संख्या में काम आता है।
अंतिम आरंभ को स्थगित किया जा सकता है।
यह सुनिश्चित करता है कि तर्क रिटर्न मूल्यों के एक जटिल प्रवाह के साथ भी हमेशा सेट किया जाता है। किसी मामले को याद करना और दुर्घटना से अशक्त होना बहुत आसान है। यह वापसी को असंभव नहीं बनाता है, बस स्पष्ट है कि यह उद्देश्य पर है:
public Object getElementAt(int index) {
final Object element;
if (index == 0) {
element = "Result 1";
} else if (index == 1) {
element = "Result 2";
} else {
element = "Result 3";
}
return element;
}
मुझे लगता है कि जावा की एक और "अनदेखी" सुविधा जेवीएम ही है। यह शायद सबसे अच्छा उपलब्ध VM है। और यह बहुत सी रोचक और उपयोगी भाषाओं (Jython, JRuby, Scala, Groovy) का समर्थन करता है। उन सभी भाषाओं को आसानी से और मूल सहयोग कर सकते हैं।
यदि आप एक नई भाषा डिज़ाइन करते हैं (जैसे कि स्कैला-केस में) तो आपके पास तुरंत सभी मौजूदा लाइब्रेरी उपलब्ध हैं और इसलिए आपकी भाषा शुरू से ही "उपयोगी" है।
वे सभी भाषाएँ हॉटस्पॉट अनुकूलन का उपयोग करती हैं। VM बहुत अच्छी तरह से मॉनिटर और डीबग करने योग्य है।
आप एक गुमनाम उपवर्ग को परिभाषित कर सकते हैं और सीधे उस पर एक विधि को कॉल कर सकते हैं भले ही वह कोई इंटरफेस लागू न करे।
new Object() {
void foo(String s) {
System.out.println(s);
}
}.foo("Hello");
start()) वास्तव में उपवर्ग में परिभाषित नहीं है ...
AsList में विधि java.util.Arraysvarargs, सामान्य तरीके और autoboxing का एक अच्छा संयोजन की अनुमति देता है:
List<Integer> ints = Arrays.asList(1,2,3);
Arrays.asListआप कर सकते हैं कि असामान्य विशेषता है set()तत्व नहीं बल्कि add()या remove()। इसलिए मैं आमतौर पर इसे एक new ArrayList(...)या एक में लपेटता हूं Collections.unmodifiableList(...), इस पर निर्भर करता है कि मैं सूची को संशोधित करना चाहता हूं या नहीं।
इस कीवर्ड का उपयोग खेतों / आंतरिक कक्षा से युक्त कक्षा के तरीकों तक पहुँचने के लिए। नीचे दिए गए, बल्कि उदाहरण के लिए, हम गुमनाम आंतरिक वर्ग से कंटेनर श्रेणी के सॉर्टिंग फ़ील्ड का उपयोग करना चाहते हैं। इस के बजाय कंटेनरक्लास.थिस.सोर्टअस्सकेडिंग का उपयोग करना। सार्टकॉन्डिंग ट्रिक करता है।
import java.util.Comparator;
public class ContainerClass {
boolean sortAscending;
public Comparator createComparator(final boolean sortAscending){
Comparator comparator = new Comparator<Integer>() {
public int compare(Integer o1, Integer o2) {
if (sortAscending || ContainerClass.this.sortAscending) {
return o1 - o2;
} else {
return o2 - o1;
}
}
};
return comparator;
}
}
MyActivity.this।
वास्तव में एक विशेषता नहीं है, लेकिन एक मनोरंजक ट्रिक जिसे मैंने हाल ही में कुछ वेब पेज में खोजा है:
class Example
{
public static void main(String[] args)
{
System.out.println("Hello World!");
http://Phi.Lho.free.fr
System.exit(0);
}
}
एक वैध जावा प्रोग्राम है (हालाँकि यह एक चेतावनी उत्पन्न करता है)। यदि आप क्यों नहीं देखते हैं, तो ग्रेगरी का जवाब देखें! ;-) अच्छा, यहाँ वाक्यविन्यास भी एक संकेत देता है!
यह बिल्कुल "छिपी हुई विशेषताएं" नहीं है और बहुत उपयोगी नहीं है, लेकिन कुछ मामलों में बेहद दिलचस्प हो सकती है:
कक्षा sun.misc.Unsafe - आपको जावा में प्रत्यक्ष मेमोरी प्रबंधन को लागू करने की अनुमति देगा (आप यहां तक कि स्वयं-संशोधित जावा कोड भी लिख सकते हैं) यदि आप बहुत प्रयास करते हैं):
public class UnsafeUtil {
public static Unsafe unsafe;
private static long fieldOffset;
private static UnsafeUtil instance = new UnsafeUtil();
private Object obj;
static {
try {
Field f = Unsafe.class.getDeclaredField("theUnsafe");
f.setAccessible(true);
unsafe = (Unsafe)f.get(null);
fieldOffset = unsafe.objectFieldOffset(UnsafeUtil.class.getDeclaredField("obj"));
} catch (Exception e) {
throw new RuntimeException(e);
}
};
}
जब की तरह छिपा घुमाओ मैं में काम कर Ctrl- Shift- F1सुविधा।
यह वर्तमान विंडो के घटक पेड़ को डंप करता है।
(मान लें कि आपने उस कीस्ट्रोक को किसी और चीज़ से नहीं बांधा है।)
प्रत्येक वर्ग फ़ाइल हेक्स मान 0xCAFEBABE से शुरू होती है ताकि इसे मान्य JVM बायटेकोड के रूप में पहचाना जा सके।
( स्पष्टीकरण )
मेरा वोट java.util.concurrent में अपने समवर्ती संग्रहों और लचीले निष्पादकों के साथ अन्य थ्रेड पूल, अनुसूचित कार्यों और समन्वित कार्यों की अनुमति देता है। DelayQueue मेरा व्यक्तिगत पसंदीदा है, जहां तत्वों को एक निर्दिष्ट देरी के बाद उपलब्ध कराया जाता है।
java.util.Timer और TimerTask को सुरक्षित रूप से आराम करने के लिए रखा जा सकता है।
इसके अलावा, बिल्कुल छिपा नहीं है, लेकिन तारीख और समय से संबंधित अन्य वर्गों से एक अलग पैकेज में। java.util.concurrent.TimeUnit नैनोसेकंड, माइक्रोसेकंड, मिलीसेकंड और सेकंड के बीच कनवर्ट करते समय उपयोगी है।
यह सामान्य से कुछ बेहतर पढ़ता है कुछValue * 1000 या someValue / 1000।
CountDownLatchऔर CyclicBarrier- इतना उपयोगी!
भाषा-स्तर का कीवर्ड।
वास्तव में जावा भाषा का हिस्सा नहीं है, लेकिन सूर्य के जेडीके के साथ आने वाला जावप डिस्सेम्बलर व्यापक रूप से ज्ञात या उपयोग नहीं किया गया है।
1.5 में प्रत्येक लूप के निर्माण के अलावा। मैं <3 यह।
// For each Object, instantiated as foo, in myCollection
for(Object foo: myCollection) {
System.out.println(foo.toString());
}
और नेस्टेड उदाहरणों में इस्तेमाल किया जा सकता है:
for (Suit suit : suits)
for (Rank rank : ranks)
sortedDeck.add(new Card(suit, rank));
प्रत्येक निर्माण के लिए सरणियों पर भी लागू होता है, जहां यह सूचक के बजाय सूचकांक चर को छुपाता है। निम्नलिखित विधि एक अंतर में मानों का योग लौटाती है:
// Returns the sum of the elements of a
int sum(int[] a) {
int result = 0;
for (int i : a)
result += i;
return result;
}
iयहां उपयोग करना अति-भ्रमित करने वाला है, क्योंकि ज्यादातर लोग उम्मीद करते हैं कि मैं एक सूचकांक हूं और सरणी तत्व नहीं।
मैंने व्यक्तिगत रूप से java.lang.Voidबहुत देर से खोजा - जेनेरिक के साथ संयोजन के रूप में कोड पठनीयता में सुधार करता है, जैसेCallable<Void>