Static Poisoning

Download Report

Transcript Static Poisoning

Static Poisoning
Review: class and instance variables
• int is a data type;
3 is a value (or instance) of that type
• A class is a data type;
an object is a value (instance) of that type
• A class variable belongs to the class as a whole; there is
only one of it
• An instance variable belongs to individual objects; there is
one of it for each object, but none for the class as a whole
• You can’t refer to an instance variable if you don’t have an
instance
• You “always” have the class
• The keyword static marks a variable as a class variable
Review: class and instance methods
• An instance method “belongs to” an individual
object—you can use it only by “sending a
message” to that object
• Example: String s = myTextField.getText();
• A class (static) method belongs to a class
• Examples:
– y = Math.abs(x);
– if (Character.isLetter(ch)) { ... }
Static context
• An application requires a public static void
main(String args[]) method
• It must be static because, before your program
starts, there aren’t any objects to send messages to
• This is a static context (a class method)
– You can send messages to objects, if you have some
objects: myTextField.setText("Hello");
– You cannot send a message to yourself, or use any
instance variables—this is a static context, not an object
• non-static variable xxx cannot be referenced
from a static context
About the term
• Static poisoning refers the fact that, in an
application, you can’t access non-static variables
or methods from a static context, so you end up
making more and more things static
• “Static poisoning” is not a term that is in
widespread use—I made it up
• There is a simple solution to this problem
An example of static poisoning
public class StaticPoison {
static int x;
static int y;
public static void main(String args[]) {
doOneThing();
}
static void doOneThing() {
x = 5;
doAnotherThing();
}
static void doAnotherThing() {
y = 10;
}
}
Another example
public class Narcissus {
int x;
int y;
int z;
}
public static void main(String args[]) {
x = 5;
y = 10;
z = x + y;
}
An attempted solution
public class Narcissus {
int x;
int y;
int z;
}
public static void main(String args[]) {
Narcissus myself = new Narcissus();
myself.x = 5;
myself.y = 10;
myself.z = myself.x + myself.y;
}
The best solution
public class Narcissus {
int x;
int y;
int z;
public static void main(String args[]) {
new Narcissus().doItAll();
}
}
void doItAll() {
x = 5;
y = 10;
z = x + y;
}
Summary
• In an application, frequently the best way to write the main
method is as follows:
• class MyClass {
public static void main(String args[]) {
MyClass myself = new MyClass();
myself.doAllTheWork();
}
void doAllTheWork() { // note: not static
}
}
The End