මෙහි බොහෝ පිළිතුරු හොඳින් ::
හැසිරීම පැහැදිලි ::
කර ඇති හෙයින්, උදාහරණ විචල්යයන් සඳහා භාවිතා කරන්නේ නම් ක්රියාකරුට යොමු කිරීමේ ක්රියාකාරී අතුරුමුහුණතට සමාන අත්සනක් අවශ්ය නොවන බව පැහැදිලි කිරීමට මම කැමැත්තෙමි . ටෙස්ට් ඕබෙක්ට් වර්ගයක් ඇති ද්විමය ක්රියාකරු අපට අවශ්ය යැයි උපකල්පනය කරමු . සාම්ප්රදායික ආකාරයෙන් එය ක්රියාත්මක වන්නේ මේ ආකාරයට ය:
BinaryOperator<TestObject> binary = new BinaryOperator<TestObject>() {
@Override
public TestObject apply(TestObject t, TestObject u) {
return t;
}
};
ඔබ නිර්නාමික ක්රියාත්මක කිරීමේදී දකින පරිදි එයට TestObject තර්කයක් දෙකක් අවශ්ය වන අතර TestObject වස්තුවක් ද ලබා දෙයි. ::
ක්රියාකරු භාවිතා කිරීමෙන් මෙම තත්වය තෘප්තිමත් කිරීම සඳහා අපට ස්ථිතික ක්රමයක් සමඟ ආරම්භ කළ හැකිය:
public class TestObject {
public static final TestObject testStatic(TestObject t, TestObject t2){
return t;
}
}
ඉන්පසු අමතන්න:
BinaryOperator<TestObject> binary = TestObject::testStatic;
හරි එය හොඳින් සම්පාදනය කළා. අපට නිදර්ශන ක්රමයක් අවශ්ය නම් කුමක් කළ යුතුද? උදාහරණ ක්රමය සමඟ TestObject යාවත්කාලීන කිරීමට ඉඩ දෙන්න:
public class TestObject {
public final TestObject testInstance(TestObject t, TestObject t2){
return t;
}
public static final TestObject testStatic(TestObject t, TestObject t2){
return t;
}
}
දැන් අපට පහත උදාහරණයට ප්රවේශ විය හැකිය:
TestObject testObject = new TestObject();
BinaryOperator<TestObject> binary = testObject::testInstance;
මෙම කේතය හොඳින් සම්පාදනය කරයි, නමුත් එකකට වඩා අඩු නොවේ:
BinaryOperator<TestObject> binary = TestObject::testInstance;
මගේ සූර්යග්රහණය මට පවසන්නේ "ටෙස්ට් ඕබෙක්ට් ... වර්ගයේ ස්ථිතික නොවන ටෙස්ට් ඉන්ස්ටාන්ස් (ටෙස්ට් ඕබෙක්ට්, ටෙස්ට් ඕබෙක්ට්) වෙත ස්ථිතික සඳහනක් කළ නොහැකි බවයි."
එහි නිදර්ශන ක්රමයක් ප්රමාණවත් තරම් සාධාරණයි, නමුත් අපි testInstance
පහත පරිදි අධික ලෙස පැටවුවහොත්:
public class TestObject {
public final TestObject testInstance(TestObject t){
return t;
}
public final TestObject testInstance(TestObject t, TestObject t2){
return t;
}
public static final TestObject testStatic(TestObject t, TestObject t2){
return t;
}
}
අමතන්න:
BinaryOperator<TestObject> binary = TestObject::testInstance;
කේතය දඩය සම්පාදනය කරයි. මන්ද එය testInstance
ද්විත්ව එකක් වෙනුවට තනි පරාමිතියක් සමඟ කැඳවනු ඇත. හරි ඉතින් අපේ පරාමිති දෙක මොකද වුණේ? මුද්රිත පිටපතට ඉඩ දී බලන්න:
public class TestObject {
public TestObject() {
System.out.println(this.hashCode());
}
public final TestObject testInstance(TestObject t){
System.out.println("Test instance called. this.hashCode:"
+ this.hashCode());
System.out.println("Given parameter hashCode:" + t.hashCode());
return t;
}
public final TestObject testInstance(TestObject t, TestObject t2){
return t;
}
public static final TestObject testStatic(TestObject t, TestObject t2){
return t;
}
}
ප්රතිදානය කරන:
1418481495
303563356
Test instance called. this.hashCode:1418481495
Given parameter hashCode:303563356
හරි ඉතින් JVM param1.testInstance (param2) අමතන්න තරම් දක්ෂයි. අපට testInstance
වෙනත් සම්පතකින් භාවිතා කළ හැකි නමුත් ටෙස්ට් ඕබෙක්ට් නොවේ, එනම්:
public class TestUtil {
public final TestObject testInstance(TestObject t){
return t;
}
}
අමතන්න:
BinaryOperator<TestObject> binary = TestUtil::testInstance;
එය සම්පාදනය නොකරන අතර සම්පාදකයා මෙසේ කියයි: "TestUtil වර්ගය testInstance (TestObject, TestObject) යන්න අර්ථ දක්වන්නේ නැත" . එබැවින් සම්පාදකයා එකම වර්ගයේ නොවේ නම් ස්ථිතික යොමු කිරීමක් සොයනු ඇත. හරි, බහුමාපකය ගැන කුමක් කිව හැකිද? අපි අවසාන වෙනස් කිරීම් ඉවත් කර අපගේ SubTestObject පන්තිය එකතු කළහොත් :
public class SubTestObject extends TestObject {
public final TestObject testInstance(TestObject t){
return t;
}
}
අමතන්න:
BinaryOperator<TestObject> binary = SubTestObject::testInstance;
එය සම්පාදනය නොකරනු ඇත, සම්පාදකයා තවමත් ස්ථිතික යොමු කිරීමක් සොයනු ඇත. නමුත් පහත කේතය සමත් වන බැවින් එය හොඳින් සම්පාදනය කරනු ඇත - පරීක්ෂණයකි:
public class TestObject {
public SubTestObject testInstance(Object t){
return (SubTestObject) t;
}
}
BinaryOperator<TestObject> binary = TestObject::testInstance;
* මම දැන් ඉගෙන ගන්නවා, ඒ නිසා මම උත්සාහ කර බැලුවෙමි, මා වැරදියි නම් මාව නිවැරදි කිරීමට නිදහස් වන්න