1. හැඳින්වීම
ජාවා (Java) සංවර්ධනය කරන විට, ඔබට නිතරම මුහුණ දෙන යතුරුපදයක් final වේ. එහෙත්, final යනු ඇත්තෙන්ම කුමක්ද, එය කවදා භාවිතා කළ යුතුද යන කරුණු බොහෝවිට පැහැදිලි නොවේ—ආරම්භකයන්ට පමණක් නොව, ජාවා ගැන තරමක් හඳුනාගත් සංවර්ධකයන්ටත්.
සාරාංශයෙන්, final යනු “තවත් වෙනස්කම් සිදු වීම වැලැක්වීම” යන අර්ථයයි. එය විචල්ය, ක්රම, සහ පන්තීන්ට යොදිය හැකි අතර, එය කෙසේ භාවිතා කරන්නේද යන පදනම මත, ඔබේ වැඩසටහනේ ශක්තිය සහ ආරක්ෂාව විශාල ලෙස වැඩි කරයි.
උදාහරණයක් ලෙස, එය අහඹු ලෙස අගයන් නැවත නියම කිරීම වැලැක්වීමට, හෝ අනිසි උරුමය සහ ක්රම අතිරේක කිරීම තහනම් කිරීමට උපකාරී වේ, එවිට අනපේක්ෂිත දෝෂ සහ දෝෂාංග වලින් වැළැක්විය හැක. තවද, final නිවැරදිව භාවිතා කිරීම අනෙකුත් සංවර්ධකයන්ට “මෙම කොටස වෙනස් නොකළ යුතුය” යනුවෙන් පැහැදිලි කරයි, එය කණ්ඩායම් සංවර්ධනයේ ඉතා ප්රයෝජනවත් වේ.
මෙම ආකාරයෙන්, final යනු ආරක්ෂිත සහ පැහැදිලි ජාවා වැඩසටහන් නිර්මාණය සඳහා අත්යවශ්ය යතුරුපදයකි. මෙම ලිපිය final මූලික භාවිතයෙන් අධික පරිමාණ භාවිතය සහ පොදු වැරදි දක්වා පැහැදිලි කරයි, ප්රායෝගික කේත උදාහරණ සමඟ. එය ජාවා නවකයන්ට පමණක් නොව, final පිළිබඳ අවබෝධය නැවත සලකා බැලීමට සහ සංවිධානය කිරීමට කැමති සංවර්ධකයන්ටද ප්රයෝජනවත් වේ.
2. final යතුරුපදයේ මූලික සමාලෝචනය
ජාවා final යතුරුපදය “තවත් වෙනස් කළ නොහැකි” සීමාව විවිධ අවස්ථා වලට යොදයි. මෙම කොටස මූලික කරුණු වලින් ආරම්භ කර final කෙසේ භාවිතා කරන්නේද යන්න පැහැදිලි කරයි.
2.1 විචල්ය වලට final යොදීම
final විචල්යයකට යොදන විට, එයට අගයක් එක් වරක් පමණක් නියම කළ හැක. ඒ පසු, නැවත නියම කිරීම අනුමත නොවේ.
ප්රාථමික වර්ග:
final int number = 10;
number = 20; // Error: cannot be reassigned because a value is already set
යොමු වර්ග:
final List<String> names = new ArrayList<>();
names = new LinkedList<>(); // Error: cannot assign a different object
names.add("Alice"); // OK: the contents of the object can be modified
නිරන්තර නියමයන් (static final):
ජාවා තුළ, අස්ථිර සහ ගෝලීයව බෙදාගන්නා නිරන්තර අගයන් static final භාවිතයෙන් ප්රකාශ කරයි.
public static final int MAX_USER = 100;
මෙවැනි අගයන් පන්තිය පුරා බෙදාගන්නා අතර නිරන්තර ලෙස සැලකේ. සාම්ප්රදායිකව, ඒවා අකුරු මහා අකුරින්, අඩකින් (_) සමඟ ලියයි.
2.2 ක්රම වලට final යොදීම
final ලෙස ක්රමයක් ප්රකාශ කරන විට, එය උපපන්තීන්හි අතිරේක කළ නොහැක. මෙය ක්රමයේ හැසිරීම ස්ථිර කර ගැනීමට හෝ ආරක්ෂිත උරුම ව්යුහයක් රැක ගැනීමට ප්රයෝජනවත් වේ.
public class Animal {
public final void speak() {
System.out.println("The animal makes a sound");
}
}
public class Dog extends Animal {
// public void speak() { ... } // Error: cannot override
}
2.3 පන්තීන්ට final යොදීම
පන්තියම final ලෙස ප්රකාශ කරන විට, එයට උරුමය ලබා ගත නොහැක.
public final class Utility {
// methods and variables
}
// public class MyUtility extends Utility {} // Error: inheritance not allowed
අවශ්ය නොවන වෙනස්කම් හෝ දිගුවක් තහනම් කිරීමට, උදාහරණයක් ලෙස උපකාරක පන්තීන් හෝ දැඩි පාලනයක් ඇති නිර්මාණ සඳහා, final පන්තීන් බහුලව භාවිතා වේ.
සාරාංශය
ඉහත පෙන්වා ඇති පරිදි, final යතුරුපදය ජාවා වැඩසටහන් තුළ “වෙනස් නොකිරීම” යන ශක්තිමත් අදහස ප්රකාශ කරයි. එය විචල්ය, ක්රම, හෝ පන්තීන්ට යොදන ආකාරය අනුව එහි භූමිකාව සහ සුදුසු භාවිතය වෙනස් වේ; එබැවින් පැහැදිලි අදහසක් සමඟ එය භාවිතා කිරීම වැදගත් වේ.
3. final සඳහා නිවැරදි භාවිතය සහ උසස් තාක්ෂණ
final යතුරුපදය වෙනස්කම් වැලැක්වීම පමණක් නොව, වාස්තුකාලීන සංවර්ධනයේ ආරක්ෂිත හා කාර්යක්ෂම කේත ලිවීම සඳහා ශක්තිමත් මෙවලමකි. මෙම කොටස ප්රායෝගික භාවිත රටා සහ උසස් තාක්ෂණ හඳුන්වා දෙයි.
3.1 ස්ථානීය විචල්ය සහ ක්රම පරාමිතීන් සඳහා final භාවිතයේ ප්රතිලාභ
final ක්ෂේත්ර සහ පන්තීන්ට පමණක් නොව, ස්ථානීය විචල්ය සහ ක්රම පරාමිතීන්ටද යොදිය හැක. මෙය එම පරාසය තුළ විචල්යය නැවත නියම නොකළ යුතු බව පැහැදිලිව පෙන්වයි.
public void printName(final String name) {
// name = "another"; // Error: reassignment not allowed
System.out.println(name);
}
දේශීය විචල්ය සඳහා final භාවිතා කිරීම සංකලන සමයේ අනපේක්ෂිත නැවත නියමනය වීම වැළැක්වීමට උපකාරී වේ. තවද, lambda හෝ නිර්නාමික පන්තිවල බාහිර විෂය පරිච්ඡේදවලින් විචල්ය භාවිතා කිරීමේදී, ඒවා final හෝ කාර්යක්ෂමව final විය යුතුය.
public void showNames(List<String> names) {
final int size = names.size();
names.forEach(n -> System.out.println(size + ": " + n));
}
3.2 සම්බන්ධක වර්ග සහ final සමඟ සාමාන්ය දෝෂයක්
බොහෝ Java සංවර්ධකයින් සඳහා වඩාත් බෙදා හරින ලද්දක්වා යම් එක් කරුණක් වන්නේ සම්බන්ධක විචල්යවලට final යෙදීමයි. සම්බන්ධකයේ නැවත නියමනය වීම තහනම් වුවද, සම්බන්ධිත වස්තුවේ අන්තර්ගතය තවමත් වෙනස් කළ හැකිය.
final List<String> items = new ArrayList<>();
items.add("apple"); // OK: modifying the contents
items = new LinkedList<>(); // NG: reassignment not allowed
එබැවින්, final යන්නෙන් “සම්පූර්ණයෙන් අපරිවර්තනීය” යන්න අදහස් නොවේ. අන්තර්ගතය ද අපරිවර්තනීය කිරීමට අපේක්ෂා කරන්නේ නම්, එය අපරිවර්තනීය පන්ති සැලසුම් හෝ Collections.unmodifiableList වැනි උපකරණ සමඟ ඒකාබද්ධ කළ යුතුය.
3.3 හොඳ පුරුදු: final භාවිතා කළ යුතු විට දැනීම
- නිරන්තර සහ නැවත නියමනය නොකළ යුතු වටිනාකම් සඳහා
finalක්රියාකාරීව භාවිතා කරන්න මෙය අරමුණ පැහැදිලි කරයි සහ සම්භාව්ය දෝෂ අඩු කරයි. - විධි සහ පන්ති සඳහා
finalභාවිතා කරන්න සැලසුම් අරමුණ ප්රකාශ කිරීමට උරුමය හෝ ඉක්මනින් කිරීම තහනම් කිරීමට අපේක්ෂා කරන විට එය ඵලදායී වේ. - අධික භාවිතයෙන් වළකින්න
finalහි අධික භාවිතය නම්යශීලත්වය අඩු කළ හැකි අතර අනාගත refactoring තදබදයට ලක් කළ හැකිය. සැමවිටම යම් දෙයක්finalකරන්නේ ඇයි දැයි සලකා බලන්න .
3.4 කේත ගුණාත්මකභාවය සහ ආරක්ෂාව වැඩිදියුණු කිරීම
final හි ඵලදායී භාවිතය කේත පාඨකත්වය සහ ආරක්ෂාව සැලකිය යුතු ලෙස වැඩිදියුණු කරයි. අනපේක්ෂිත වෙනස්කම් වැළැක්වීමෙන් සහ සැලසුම් අරමුණ පැහැදිලිව ප්රකාශ කිරීමෙන්, final මූලපදය බොහෝ Java සංවර්ධන පරිසරවල ප්රසිද්ධියෙන් නිර්දේශ කෙරේ.
4. හොඳ පුරුදු සහ කාර්ය සාධනය සලකා බැලීම්
final මූලපදය වෙනස්කම් වැළැක්වීමට පමණක් නොව, සැලසුම් සහ කාර්ය සාධනයේ දෘෂ්ටිකෝණවලින් ද භාවිතා වේ. මෙම කොටස හොඳ පුරුදු සහ කාර්ය සාධනය සම්බන්ධ සලකා බැලීම් හඳුන්වා දෙයි.
4.1 සුවිශේෂී කේතයේ නිරන්තර, විධි, සහ පන්ති සඳහා final
finalනිරන්තර (static final) බහුලව භාවිතා වන හෝ අපරිවර්තනීය වටිනාකම්static finalලෙස නිර්වචනය කිරීම යෙදුම පුරා ස්ථිරභාවය සහතික කරයි. සාමාන්ය උදාහරණවලට දෝෂ පණිවිඩ, සීමාවන්, සහ ගෝලීය සැකසුම් වටිනාකම් ඇතුළත් වේ.public static final int MAX_RETRY = 3; public static final String ERROR_MESSAGE = "An error has occurred.";
- විධි සහ පන්ති සඳහා
finalභාවිතා කිරීමට හේතුව ඒවාfinalලෙස ප්රකාශ කිරීම ඒවායේ හැසිරීම වෙනස් නොවිය යුතු බව පැහැදිලිව සඳහන් කරයි, අන්යයන් හෝ ඔබගේ අනාගත ස්වයං විසින් අනපේක්ෂිත වෙනස්කම්වල ঝුকිය අඩු කරයි.
4.2 JVM ඉංග්රීමකරණය සහ කාර්ය සාධනය බලපෑම
final මූලපදය කාර්ය සාධන ප්රතිලාභ ලබා දිය හැකිය. JVM final විචල්ය සහ විධි වෙනස් නොවන බව දන්නා බැවින්, එය inlining සහ caching වැනි ඉංග්රීමකරණ කිරීමට වඩා පහසුවෙන් හැකිය.
කෙසේ වෙතත්, නූතන JVMs දැනටමත් උසස් ඉංග්රීමකරණ ස්වයංක්රීයව කරයි, එබැවින් final වලින් ලැබෙන කාර්ය සාධන වැඩිදියුණු කිරීම් ද්විතීයික ලෙස සලකා බැලිය යුතුය. ප්රාථමික ඉලක්ක සැලසුම් පැහැදිලිකම සහ ආරක්ෂාව ඉතිරි වේ.
4.3 තන්තු ආරක්ෂාව වැඩිදියුණු කිරීම
බහුතන්තු පරිසරවල, අනපේක්ෂිත තත්ත්ව වෙනස්කම් සුක්ෂ්ම දෝෂ ඇති කළ හැකිය. ආරම්භකරණයෙන් පසු වටිනාකම් වෙනස් නොවන බව සහතික කිරීමට final භාවිතා කිරීමෙන්, ඔබට තන්තු ආරක්ෂාව සැලකිය යුතු ලෙස වැඩිදියුණු කළ හැකිය.
public class Config {
private final int port;
public Config(int port) {
this.port = port;
}
public int getPort() { return port; }
}
මෙම අපරිවර්තනීය වස්තු ප්රතිරූපය තන්තු-ආරක්ෂිත කේතනයේ මූලික ප්රවේශයකි.
4.4 අධික භාවිතයෙන් වළකින්න: සමබර සැලසුම් වැදගත් වේ
final බලවත් වුවද, එය ඕනෑම තැනක යෙදිය යුතු නොවේ.
- අනාගත දිගුව අවශ්ය විය හැකි කොටස්
finalකිරීම සවිස්තරාත්මකව සලස්වීමේ හැකියාව අඩු කරයි. finalපිළිබඳ නිර්මාණ අරමුණ පැහැදිලි නොවන්නේ නම්, එය නඩත්තු කිරීමේ හැකියාවට අඩුපාඩු සිදු කරයි.
හොඳම ක්රමය:
finalයෙදිය යුතුය කිසි විටෙකත් වෙනස් නොවන කොටස් වලට පමණක්- අනාගත දිගුව හෝ නැවත සැලසුම් කිරීමේ අපේක්ෂාව ඇති අවස්ථා වල
finalභාවිතය වලක්වන්න
5. පොදු වැරදි සහ වැදගත් සටහන්
final යතුරුපදය ප්රයෝජනවත් වුවද, වැරදි භාවිතය අනපේක්ෂිත හැසිරීමක් හෝ අතිශය දැඩි නිර්මාණයක් ඇති කරයි. මෙම කොටස පොදු වැරදි සහ අවධානය යොමු කළ යුතු කරුණු සාරාංශ කරයි.
5.1 යොමු වර්ග පිළිබඳ වැරදි අවබෝධය
බොහෝ සංවර්ධකයන් final යනු වස්තුව සම්පූර්ණයෙන්ම අචල බවට පත් කරයි යැයි වැරදි ලෙස විශ්වාස කරති. වාස්තු විශේෂයෙන්, එය යොමු කිරීමේ නැවත නියෝජනය කිරීම පමණක් තහනම් කරයි; වස්තුවේ අන්තර්ගතය තවමත් වෙනස් කළ හැක.
final List<String> names = new ArrayList<>();
names.add("Sato"); // OK
names = new LinkedList<>(); // NG: reassignment not allowed
අන්තර්ගතය අචල කිරීමට, Collections.unmodifiableList() වැනි අචල පන්තීන් හෝ එකතු කිරීම් භාවිතා කරන්න.

5.2 අබ්ස්ට්රැක්ට් පන්තීන් හෝ අතුරුමුහුණත් සමඟ එකතු කළ නොහැක
final උරුම කිරීම සහ අතිරේක කිරීම තහනම් කරන බැවින්, එය abstract පන්තීන් හෝ අතුරුමුහුණත් සමඟ එකතු කළ නොහැක.
public final abstract class Sample {} // Error: cannot use abstract and final together
5.3 final අධික ලෙස භාවිත කිරීම දිගුව හැකියාව අඩු කරයි
දෘඩතාවය සඳහා final සෑම තැනකම යෙදීම අනාගත වෙනස්කම් සහ දිගුව කිරීම් අමාරු කරයි. නිර්මාණ අරමුණ කණ්ඩායමේ සියලු දෙනාට පැහැදිලිව බෙදාගත යුතුය.
5.4 ආරම්භකයන් හෝ නිර්මාතෘවලදී ආරම්භ කිරීම අමතක කිරීම
final විචල්යයන් එකවර පමණක් අගයක් ලබා දිය යුතුය. ඒවා ප්රකාශනයේදී හෝ නිර්මාතෘ තුළ ආරම්භ කළ යුතුය.
public class User {
private final String name;
public User(String name) {
this.name = name; // required initialization
}
}
5.5 ලැම්බ්ඩා සහ අනොනීම් පන්තීන්හි “ප්රායෝගිකව Final” අවශ්යතාව
ලැම්බ්ඩා හෝ අනොනීම් පන්තීන් තුළ භාවිතා වන විචල්යයන් final හෝ ප්රායෝගිකව final (නැවත නියෝජනය නොකළ) විය යුතුය.
void test() {
int x = 10;
Runnable r = () -> System.out.println(x); // OK
// x = 20; // NG: reassignment breaks effectively final rule
}
සාරාංශය
- පැහැදිලි අරමුණක් සමඟ
finalභාවිතා කරන්න. - වැරදි අවබෝධය සහ අධික භාවිතය වලක්වා ආරක්ෂාව සහ දිගුව හැකියාව රැකගන්න.
6. ප්රායෝගික කේත උදාහරණ සහ භාවිතා නඩු
final ක්රියාකාරිත්වය අවබෝධ කරගත් පසු, ප්රායෝගික භාවිතා නඩු දැකීම සංකල්පය තහවුරු කරයි. මෙන්න සාමාන්ය වාස්තුකාලීන උදාහරණ.
6.1 static final සමඟ ස්ථිර ප්රකාශන
public class MathUtil {
public static final double PI = 3.141592653589793;
public static final int MAX_USER_COUNT = 1000;
}
6.2 Final ක්රම සහ Final පන්තීන්ගේ උදාහරණ
Final ක්රම උදාහරණය:
public class BasePrinter {
public final void print(String text) {
System.out.println(text);
}
}
public class CustomPrinter extends BasePrinter {
// Cannot override print
}
Final පන්තී උදාහරණය:
public final class Constants {
public static final String APP_NAME = "MyApp";
}
6.3 ක්රම පරාමිතීන් සහ ස්ථානීය විචල්ය සඳහා final භාවිතය
public void process(final int value) {
// value = 100; // Error
System.out.println("Value is " + value);
}
6.4 අචල වස්තු රටාව
public final class User {
private final String name;
private final int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() { return name; }
public int getAge() { return age; }
}
6.5 එකතු කිරීම් final සමඟ එකතු කිරීම
public class DataHolder {
private final List<String> items;
public DataHolder(List<String> items) {
this.items = Collections.unmodifiableList(new ArrayList<>(items));
}
public List<String> getItems() {
return items;
}
}
7. නිගමනය
Java final මූලපදය නොබද්ධතාව (immutability) ප්රකාශ කිරීම, නැවත assign කිරීම වැළැක්වීම සහ උරුමය (inheritance) හෝ ඉස්මතු (overriding) තහනම් කිරීම සඳහා අත්යවශ්ය යාන්ත්රණයකි.
එහි ප්රධාන ප්රතිලාභ ඇතුළත් වන්නේ වැඩිදියුණු ආරක්ෂාව, පැහැදිලි නිර්මාණ අරමුණු සහ හැකි ප්රදර්ශනය (performance) සහ ෂෝධන-ආරක්ෂිතභාවය (thread-safety) වැඩිදියුණු කිරීම්.
කෙසේ වෙතත්, final භාවිතා කළ යුත්තේ සංවේදීවයි. Reference හැසිරීම තේරුම් ගැනීම සහ එය සුදුසු තැන්වල පමණක් භාවිතා කිරීම robust සහ maintainable Java වැඩසටහන් සඳහා තුඩු දෙයි.
final යනු robust සහ readable කේත ලිවීම සඳහා සහකරුවෙකි. ආරම්භකයින් සහ අත්දැකීම් සහිත සංවර්ධකයින් දෙදෙනාම එහි නිවැරදි භාවිතය නැවත සලකා බැලීමෙන් ප්රතිලාභ ලබා ගත හැකිය.
8. FAQ (පොදු ප්රශ්න)
ප්රශ්න 1. final භාවිතා කිරීමෙන් Java වැඩසටහන් වේගවත් වේද?
උ. සමහර අවස්ථාවලදී JVM optimizations ප්රදර්ශනය වැඩිදියුණු කළ හැකි වුවද, ප්රධාන ප්රතිලාභය වන්නේ වේගය නොව ආරක්ෂාව සහ පැහැදිලිභාවයයි.
ප්රශ්න 2. ක්රම හෝ පන්ති මත final භාවිතා කිරීමේ අවාසි තිබේද?
උ. ඔව්. එය උරුමය හෝ ඉස්මතු මගින් ව්යාප්තිය වැළැක්වීමෙන් අනාගත නැවත නිර්මාණවල නම්යශීලීභාවය අඩු කරයි.
ප්රශ්න 3. final reference variable එකේ අන්තර්ගතය වෙනස් කළ හැකිද?
උ. ඔව්. Reference එක නොබද්ධයි, නමුත් object එකේ අභ්යන්තර තත්ත්වය තවමත් වෙනස් කළ හැකිය.
ප්රශ්න 4. final සහ abstract එකතුවෙන් භාවිතා කළ හැකිද?
උ. නැත. ඒවා විරුද්ධ නිර්මාණ අරමුණු නියෝජනය කරන අතර compile-time දෝෂයක් ඇති කරයි.
ප්රශ්න 5. ක්රම parameters සහ local variables සැමවිටම final විය යුතුද?
උ. නැවත assign කිරීම වැළැක්විය යුතු තැන්වල final භාවිතා කරන්න, නමුත් අනවශ්යව ඕනෑම තැනක බල කරන්න එපා.
ප්රශ්න 6. lambdas වල භාවිතා වන variables මත සීමාවන් තිබේද?
උ. ඔව්. Variables final හෝ effectively final විය යුතුය.
ප්රශ්න 7. final අධික භාවිතය කිරීම ගැටලුවකිද?
උ. අධික භාවිතය නම්යශීලීභාවය සහ ව්යාප්තිය අඩු කරයි. නොබද්ධතාව ඇත්තටම අවශ්ය තැන්වල පමණක් භාවිතා කරන්න.
