সি # এর লুকানো বৈশিষ্ট্যগুলি পড়ার পরে আমি ভাবলাম, জাভা সম্পর্কিত কিছু লুকানো বৈশিষ্ট্য কী?
সি # এর লুকানো বৈশিষ্ট্যগুলি পড়ার পরে আমি ভাবলাম, জাভা সম্পর্কিত কিছু লুকানো বৈশিষ্ট্য কী?
উত্তর:
ডাবল ব্রেস সূচনা আমাকে কয়েক মাস আগে অবাক করে দিয়েছিল যখন আমি এটি প্রথম আবিষ্কার করেছি, এর আগে কখনও শুনিনি।
থ্রেডলোকালগুলি সাধারণত প্রতি-থ্রেডের স্থিতি সংরক্ষণের উপায় হিসাবে এত বেশি পরিচিত নয়।
যেহেতু 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);
}
প্রদত্ত দুটি সংগ্রহ সমান হয় বা যদি তাদের মধ্যে একটিতে প্রদত্ত উপাদান থাকে, অন্যথায় মিথ্যা হয় তবে এই স্বীকৃত পদ্ধতিটি সত্যটি প্রত্যাবর্তন করবে। লক্ষ্য করার বিষয়টি হ'ল আপনি আর্গুমেন্ট বি 1 এবং বি 2 তে তুলনামূলক এবং সংগ্রহ উভয়ের পদ্ধতির আবেদন করতে পারেন।
আমি অন্য দিন উদাহরণস্বরূপ দ্বারা অবাক হয়েছিল। আমি কিছু কোড-ভাঁজ পদ্ধতি মুছে ফেলছিলাম এবং একাধিক উদাহরণ সূচনা তৈরির কাজ শেষ করেছি:
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");
}};
জেডিকে ১.6.০7++ এ ভিজুয়ালভিএম (বিন / jvisualvm.exe) নামে একটি অ্যাপ্লিকেশন রয়েছে যা অনেকগুলি সরঞ্জামের শীর্ষে একটি দুর্দান্ত জিইউআই। এটি জে কনসোলের চেয়ে আরও বিস্তৃত বলে মনে হচ্ছে।
জাভা 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/classpath.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জাভাতে কে কেবল একটি কীওয়ার্ড বলেছিল ? :)
কোভেরিয়েন্ট রিটার্নের ধরণগুলি সম্পর্কে কীভাবেJDK 1.5 এর ? এটি বেশ খারাপভাবে প্রচার করা হয়েছে, কারণ এটি একটি আনসেক্সি সংযোজন, তবে আমি এটি যেমন বুঝতে পেরেছি, জেনারিকদের কাজ করা একেবারে প্রয়োজনীয় necessary
মূলত, সংকলকটি এখন একটি সাবক্লাসকে মূল পদ্ধতির রিটার্ন টাইপের একটি সাবক্লাস হতে একটি ওভাররাইড পদ্ধতির রিটার্ন টাইপকে সংকীর্ণ করার অনুমতি দেয়। সুতরাং এটি অনুমোদিত:
class Souper {
Collection<String> values() {
...
}
}
class ThreadSafeSortedSub extends Souper {
@Override
ConcurrentSkipListSet<String> values() {
...
}
}
আপনি উপশ্রেণী এর কল করতে পারেন valuesপদ্ধতি এবং একটি সাজানো থ্রেড নিরাপদ প্রাপ্ত Setএর Stringগুলি নিক্ষেপ করেও করতে ConcurrentSkipListSet।
শেষ অবধি নিয়ন্ত্রণের স্থানান্তর কোনও ব্যতিক্রম ছুঁড়ে দেয়। নিম্নলিখিত কোডটি রানটাইমেক্সেপশন নিক্ষেপ করে না - এটি হারিয়ে যায়।
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 )
{
...
}
freeকরার আগে বা deleteশূন্যতার আগে নাল পরীক্ষা করা । এ জাতীয় মৌলিক ধারণা।
এনামগুলিতে অনুমতি দেওয়ার পদ্ধতি এবং নির্মাতারা আমাকে অবাক করে দিয়েছিল। উদাহরণ স্বরূপ:
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()। এটি এমন কিছু পদ্ধতির অনুরোধের জন্যও কার্যকর যেখানে একটি সাধারণ সংগ্রহের.অম্পটিম্যাপ () একটি সংকলন ত্রুটি দেয়।
আপনি একটি ইন্টারফেস প্রয়োগ করতে enums ব্যবহার করতে পারেন।
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মাধ্যম ব্যবহার করে আমি এর মধ্যে অন্তর্নির্মিত একটি সংকলন (পাঁচ) এর সংজ্ঞা দিতে পারি।
জাভা 1.5 হিসাবে, জাভা এখন ভেরিয়েবল আরটি ফাংশন লেখার জন্য একটি অনেক ক্লিনার সিনট্যাক্স আছে। সুতরাং, কেবল একটি অ্যারে পাস করার পরিবর্তে, আপনি নিম্নলিখিতটি করতে পারেন
public void foo(String... bars) {
for (String bar: bars)
System.out.println(bar);
}
বারগুলি স্বয়ংক্রিয়ভাবে নির্দিষ্ট ধরণের অ্যারেতে রূপান্তরিত হয়। বিশাল জয় নয়, তবুও একটি জয়।
আমার প্রিয়: সমস্ত থ্রেড স্ট্যাকের ট্রেসগুলিকে স্ট্যান্ডার্ড আউট করে ফেলুন।
উইন্ডোজ: CTRL- Breakআপনার জাভা সিএমডি / কনসোল উইন্ডোতে
UNIX: 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;
}
আমি মনে করি জাভা এর আর একটি "উপেক্ষিত" বৈশিষ্ট্যটি নিজেই জেভিএম। এটি সম্ভবত সেরা ভিএম উপলব্ধ। এবং এটি প্রচুর আকর্ষণীয় এবং দরকারী ভাষাগুলি সমর্থন করে (জাইথন, জেআরবি, স্কালা, গ্রোভি)। এই সমস্ত ভাষা সহজেই এবং নির্বিঘ্নে সহযোগিতা করতে পারে।
আপনি যদি কোনও নতুন ভাষা ডিজাইন করেন (যেমন স্কেল-কেসের মতো) আপনার তাত্ক্ষণিকভাবে বিদ্যমান সমস্ত গ্রন্থাগার পাওয়া যায় এবং তাই আপনার ভাষা প্রথম থেকেই "দরকারী"।
এই সমস্ত ভাষা হটস্পট অপ্টিমাইজেশন ব্যবহার করে। ভিএম খুব ভাল মনিটর এবং ডিবাগযোগ্য।
আপনি কোনও বেনামে সাবক্লাস সংজ্ঞায়িত করতে পারেন এবং কোনও ইন্টারফেস প্রয়োগ না করে এমনকি এটিতে সরাসরি কোনও পদ্ধতিতে কল করতে পারেন।
new Object() {
void foo(String s) {
System.out.println(s);
}
}.foo("Hello");
start()) নামে যে পদ্ধতিটি আহ্বান করা হয়েছে তা উপক্লাসে আসলে সংজ্ঞায়িত করা হয়নি ...
AsList পদ্ধতি java.util.Arraysভারার্গস জেনেরিক পদ্ধতি এবং 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);
}
}
একটি বৈধ জাভা প্রোগ্রাম (যদিও এটি একটি সতর্কতা উত্পন্ন করে)। যদি না দেখেন তবে গ্রেগরির উত্তর দেখুন! ;-) ভাল, সিনট্যাক্স এখানে হাইলাইট করা একটি ইঙ্গিত দেয়!
এটি হুবহু "লুকানো বৈশিষ্ট্য" নয় এবং খুব কার্যকর নয়, তবে কিছু ক্ষেত্রে অত্যন্ত আকর্ষণীয়ও হতে পারে:
ক্লাস সান.মিসিক.উনস্যাফ - আপনাকে জাভাতে সরাসরি মেমরি ম্যানেজমেন্ট প্রয়োগ করতে অনুমতি দেবে (আপনি নিজের সাথে জাভা কোডটি স্ব-সংশোধন করতে পারেন) এটি যদি আপনি অনেক চেষ্টা করেন):
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বৈশিষ্ট্য।
এটি বর্তমান উইন্ডোর উপাদান গাছটি ফেলে দেয়।
(ধরে নিচ্ছেন আপনি কী-স্ট্রোককে অন্য কোনও কিছুর সাথে আবদ্ধ করেননি।)
আমার ভোট java.util.concurrent এ যায় তার সমবর্তী সংগ্রহগুলি এবং নমনীয় নির্বাহীদের সাথে অন্যদের মধ্যে পুল, তফসিলযুক্ত কার্য এবং সমন্বিত কার্যগুলিকে থ্রেড করার অনুমতি দেয়। DelayQueue আমার ব্যক্তিগত প্রিয়, যেখানে নির্দিষ্ট বিলম্বের পরে উপাদানগুলি উপলব্ধ করা হয়।
java.util.Timer এবং টাইমার টাস্ক নিরাপদে বিশ্রামে রাখা যেতে পারে।
এছাড়াও, ঠিক লুকানো নয় তবে তারিখ এবং সময় সম্পর্কিত অন্যান্য শ্রেণি থেকে আলাদা প্যাকেজে। java.util.concurrent.TimeUnit ন্যানোসেকেন্ডস, মাইক্রোসেকেন্ডস, মিলিসেকেন্ড এবং সেকেন্ডের মধ্যে রূপান্তর করার সময় দরকারী।
এটি সাধারণ কিছু ভ্যালু * 1000 বা কিছু ভ্যালু / 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>