Design with static members

原创 2003年04月17日 09:23:00

Advertisement: Support JavaWorld, click here!







Core Java
Enterprise Java
Micro Java
Applied Java
Java Community



JavaWorld Services
Free JavaWorld newsletters


Education Resources

White Paper Library

NEW! Rational Resources




Design Techniques
Design with static members
How to put static fields and methods to work
In this installment of his Design Techniques column, Bill Venners discusses the ways in which static fields and methods, which exist outside of objects, fit in a design that's object-oriented. (1,500 words)
By Bill Venners

 Printer-friendly version |  Mail this to a friend

Page 1 of 2

lthough Java is object-oriented to a great extent, it is not a pure object-oriented language. One of the reasons Java is not purely object-oriented is that not everything in it is an object. For example, Java allows you to declare variables of primitive types (int, float, boolean, etc.) that aren't objects. And Java has static fields and methods, which are independent and separate from objects. This article gives advice on how to use static fields and methods in a Java program, while maintaining an object-oriented focus in your designs.
The lifetime of a class in a Java virtual machine (JVM) has many similarities to the lifetime of an object. Just as an object can have state, represented by the values of its instance variables, a class can have state, represented by the values of its class variables. Just as the JVM sets instance variables to default initial values before executing initialization code, the JVM sets class variables to default initial values before executing initialization code. And like objects, classes can be garbage collected if they are no longer referenced by the running application.
Nevertheless, significant differences exist between classes and objects. Perhaps the most important difference is the way in which instance and class methods are invoked: instance methods are (for the most part) dynamically bound, but class methods are statically bound. (In three special cases, instance methods are not dynamically bound: invocation of private instance methods, invocation of init methods (constructors), and invocations with the super keyword. See Resources for more information.)
Another difference between classes and objects is the degree of data hiding granted by the private access levels. If an instance variable is declared private, only instance methods can access it. This enables you to ensure the integrity of the instance data and make objects thread-safe. The rest of the program cannot access those instance variables directly, but must go through the instance methods to manipulate the instance variables. In an effort to make a class behave like a well-designed object, you can make class variables private and define class methods that manipulate them. Nevertheless, you don't get as good a guarantee of thread safety or even data integrity in this way, because a certain kind of code has a special privilege that gives them direct access to private class variables: instance methods, and even initializers of instance variables, can access those private class variables directly.
So the static fields and methods of classes, although similar in many ways to the instance fields and methods of objects, have significant differences that should affect the way you use them in designs.
Treating classes as objects
As you design Java programs, you will likely encounter many situations in which you feel the need for an object that acts in some ways like a class. You may, for example, want an object whose lifetime matches that of a class. Or you may want an object that, like a class, restricts itself to a single instance in a given name space.
In design situations such as these, it can be tempting to create a class and use it like an object in order to define class variables, make them private, and define some public class methods that manipulate the class variables. Like an object, such a class has state. Like a well-designed object, the variables that define the state are private, and the outside world can only affect this state by invoking the class methods.
Unfortunately, some problems exist with this "class-as-object" approach. Because class methods are statically bound, your class-as-object won't enjoy the flexibility benefits of polymorphism and upcasting. (For definitions of polymorphism and dynamic binding, see the Design Techniques article, Composition versus Inheritance.) Polymorphism is made possible, and upcasting useful, by dynamic binding, but class methods aren't dynamically bound. If someone subclasses your class-as-object, they will not be able to override your class methods by declaring class methods of the same name; they will only be able to hide them. When one of these redefined class methods is invoked, the JVM will select the method implementation to execute not by the class of an object at runtime, but by the type of a variable at compile time.
In addition, the thread safety and data integrity achieved by your meticulous implementation of the class methods in your class-as-object is like a house built of straw. Your thread safety and data integrity will be guaranteed so long as everyone uses the class methods to manipulate the state stored in the class variables. But a careless or clueless programmer could, with the addition of one instance method that accesses your private class variables directly, inadvertently huff and puff and blow your thread safety and data integrity away.
For this reason, my main guideline concerning class variables and class methods is:
Don't treat classes like objects.
In other words, don't design with static fields and methods of a class as if they were the instance fields and methods of an object.
If you want some state and behavior whose lifetime matches that of a class, avoid using class variables and class methods to simulate an object. Instead, create an actual object and use a class variable to hold a reference to it and class methods to provide access to the object reference. If you want to ensure that only one instance of some state and behavior exists in a single name space, don't try to design a class that simulates an object. Instead, create a singleton -- an object guaranteed to have only one instance per name space.

Next page >
Page 1 Design with static members
Page 2 So what are class members good for?

 Printer-friendly version |  Mail this to a friend


Bill Venners' next book is Flexible Java

An complete online reprint of Chapter 7, "The Linking Model," of Bill Venners' book Inside the Java Virtual Machine

The handout and slides for Bill Venners' Dynamic Extension in Java talk.

Bill Venners recently returned from his European bike trip. Read about it at:

The discussion forum devoted to the material presented in this article

Links to all previous design techniques articles

Recommended books on Java design

A transcript of an e-mail debate between Bill Venners, Mark Johnson (JavaWorld's JavaBeans columnist), and Mark Balbe on whether or not all objects should be made into beans

Object orientation FAQ

7237 Links on Object Orientation

The Object-Oriented Page

Collection of information on OO approach

Design Patterns Home Page

A Comparison of OOA and OOD Methods

Object-Oriented Analysis and Design Methods: A Comparative Review

Patterns discussion FAQ

Patterns in Java AWT

Software Technology's Design Patterns Page

Previous Design Techniques articles


Advertisement: Support JavaWorld, click here!


Copyright ?2003, an IDG company


并查集 连接的定义: 1. a连接b,则b连接a。对称性 2. a连接b,b连接c,则a连接c。传递性 并查集的作用:判断两个点是否连接;找出所有连接着的集合 应用举例: 连通,10x10...
  • sevenseablue
  • sevenseablue
  • 2013年09月04日 12:04
  • 2078


Reading input...  Reading program jar [/data/rdm/projects/7060/bin/proguard/original.jar]  Reading...
  • huiguixian
  • huiguixian
  • 2014年12月19日 11:21
  • 8055

JAVA 静态代码分析--规范检查-checkstyle

JAVA 代码分析
  • magic_wz
  • magic_wz
  • 2013年11月19日 11:36
  • 10684

Static Classes and Static Class Members

Static Classes and Static Class Members (C# Programming Guide) Visual Studio 2005 Other...
  • DSIslander
  • DSIslander
  • 2012年11月13日 09:22
  • 228

  • 2015年11月15日 23:42
  • 9.2MB
  • 下载

A new static test of a DAC with a built-in structure

  • 2012年12月24日 22:30
  • 1.33MB
  • 下载

Secure programming with static analysis

  • 2007年10月04日 13:00
  • 4.71MB
  • 下载

Creating Apps With Material Design —— Defining Custom Animations

  • x359981514
  • x359981514
  • 2014年10月20日 12:28
  • 2929

Creating Apps With Material Design —— Maintaining Compatibility

保持兼容性如material design和自定义活动的过渡部分材料设计功能只能在Android5.0(API等级21)以上。不过,你可以设计你的应用程序在支持材料设计,仍然与设备运行的是Androi...
  • x359981514
  • x359981514
  • 2014年10月20日 12:26
  • 3044

Zigzag Codes: MDS Array Codes With Optimal Rebuilding Design

利用GF域操作构建了一种能够实现optimal rebuild的MDS编码 zigzag编码。
  • cansdmz
  • cansdmz
  • 2015年05月14日 11:32
  • 304
您举报文章:Design with static members