You need to sign in to do that
Don't have an account?
Pulkit Sood 6
Static variable NOT retaining its value, but Instance variable is
Static variable is not retaining its value
public class trial {
Integer x=0;
static Integer y=0;
public void setX(Integer i){
x=i;
}
public Integer getX(){
return x;
}
public pageReference ChangeValue(){
//action
System.debug('action x - '+x+' to '+(++x)+' and y - '+y);
return null;
}
public void getChangeValue(){
//oclick
if(y==0){System.debug(this+' onclick y - '+y+' to '+(++y)+' & x - '+x+' to '+(++x));return;}
System.debug(this+' onclick x - '+x+' to '+(++x)+' and y - '+y);
}
}
------------------------------------------------------------------------------------------------------------------------------------------------------
When page loads, onClick is run automatically, why?? but anyways it should set the value for static y=1, i.e. next time after "if" statements should run
it debugs as "y=0 to y=1"
then when i click the button it again debugs as "y=0 to y=1" i.e. the class isn't retaining Static variable's value, but would work/retain-its-value if i remove STATIC KEYWORD from defination. i.e. make it an instance variable instance
but, with static, it debugs as "y=0 to y=1" every time i click the button, though it should have been set as right after the first debug
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
VF:-
<apex:page controller="trial">
<apex:includeScript value="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"/>
<apex:form >
<apex:commandButton value="Change and Set Value" onClick="{!changeValue}" action="{!changeValue}"/>
</apex:form>
<script>
var x;
function setValue(){
var op=$("label[id$='oplbl']");
x ='{!X}';
alert('x - '+x);
op.text(x+'');
return x;
}
</script>
</apex:page>
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
X IS INSTANCE VAR AND Y IS STATIC Var
AFTER PAGE LOADS, ON CLICK METHOD RUNS BY ITSELF:-
13:08:52:009 USER_DEBUG [20]|DEBUG|trial:[x=0, y=0] onclick y - 0 to 1 & x - 0 to 1
WHEN I CLICK:-
13:10:13:009 USER_DEBUG [14]|DEBUG|action x - 1 to 2 and y - 0
13:10:13:013 USER_DEBUG [20]|DEBUG|trial:[x=2, y=0] onclick y - 0 to 1 & x - 2 to 3 //second execution for onclick method must have the y's value=1, but it rather preserves x's value
WHEN I CLICK AGAIN:-
13:14:17:009 USER_DEBUG [14]|DEBUG|action x - 3 to 4 and y - 0
13:14:17:013 USER_DEBUG [20]|DEBUG|trial:[x=4, y=0] onclick y - 0 to 1 & x - 4 to 5
public class trial {
Integer x=0;
static Integer y=0;
public void setX(Integer i){
x=i;
}
public Integer getX(){
return x;
}
public pageReference ChangeValue(){
//action
System.debug('action x - '+x+' to '+(++x)+' and y - '+y);
return null;
}
public void getChangeValue(){
//oclick
if(y==0){System.debug(this+' onclick y - '+y+' to '+(++y)+' & x - '+x+' to '+(++x));return;}
System.debug(this+' onclick x - '+x+' to '+(++x)+' and y - '+y);
}
}
------------------------------------------------------------------------------------------------------------------------------------------------------
When page loads, onClick is run automatically, why?? but anyways it should set the value for static y=1, i.e. next time after "if" statements should run
it debugs as "y=0 to y=1"
then when i click the button it again debugs as "y=0 to y=1" i.e. the class isn't retaining Static variable's value, but would work/retain-its-value if i remove STATIC KEYWORD from defination. i.e. make it an instance variable instance
but, with static, it debugs as "y=0 to y=1" every time i click the button, though it should have been set as right after the first debug
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
VF:-
<apex:page controller="trial">
<apex:includeScript value="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"/>
<apex:form >
<apex:commandButton value="Change and Set Value" onClick="{!changeValue}" action="{!changeValue}"/>
</apex:form>
<script>
var x;
function setValue(){
var op=$("label[id$='oplbl']");
x ='{!X}';
alert('x - '+x);
op.text(x+'');
return x;
}
</script>
</apex:page>
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
X IS INSTANCE VAR AND Y IS STATIC Var
AFTER PAGE LOADS, ON CLICK METHOD RUNS BY ITSELF:-
13:08:52:009 USER_DEBUG [20]|DEBUG|trial:[x=0, y=0] onclick y - 0 to 1 & x - 0 to 1
WHEN I CLICK:-
13:10:13:009 USER_DEBUG [14]|DEBUG|action x - 1 to 2 and y - 0
13:10:13:013 USER_DEBUG [20]|DEBUG|trial:[x=2, y=0] onclick y - 0 to 1 & x - 2 to 3 //second execution for onclick method must have the y's value=1, but it rather preserves x's value
WHEN I CLICK AGAIN:-
13:14:17:009 USER_DEBUG [14]|DEBUG|action x - 3 to 4 and y - 0
13:14:17:013 USER_DEBUG [20]|DEBUG|trial:[x=4, y=0] onclick y - 0 to 1 & x - 4 to 5
A static variable is static only within the scope of the Apex transaction. It’s not static across the server or the entire organization. The value of a static variable persists within the context of a single transaction and is reset across transaction boundaries.
Fyi https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_classes_static.htm;
Please mark this as best Answer.
About the instnace variable serlized and stored in hidden form fields of visualforce page.
FYI : https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_classes_static.htm
Please mark this as best answer if this helps.
There are multiple levels of scope. Let's assume scopes roughly similar to: organization, transaction, and instance.
Organization scope would be similar to sObject records, Custom Metadata, Custom Settings, or Platform Cache. This data can persist for long periods of time
Transaction scope (such as your static variables) are initialized once for each transaction execution. For example nesting insert/update calls in a single transaction will still have the same static variable assignments, but once that transaction completes you will lose those static variables since they are only valid for that single transaction scope.
Instance scopes generally are within a transaction, but in the context of a Visualforce page, the controller's state is serialized into a viewstate and passed back and forth to allow the Visualforce page to keep its state.