The WeakReference class, monitoring memory leak and garbage collection in a Java application

Image
 Below is a Stack implementation that uses an internal resizeable array structure.  public class MyStack< T > implements Stack< T > { private static final int CAPACITY = 100 ; private Object[] array ; private int pos = 0 ; public MyStack () { this . array = new Object[ CAPACITY ] ; } @Override public void push ( T item) { if ( pos >= array . length / 2 ) { Object[] newArray = new Object[ pos * 2 ] ; System. arraycopy ( array , 0 , newArray , 0 , array . length ) ; array = newArray ; } array [ pos ++] = item ; } @Override public T pop () { if (isEmpty()) { throw new RuntimeException( "empty stack" ) ; } @SuppressWarnings ( "unchecked" ) T item = ( T ) array [ pos - 1 ] ; pos -= 1 ; return item ; } @Override @SuppressWarnings ( "unchecked" ) public T peek...

Visitor Tasarım Kalıbını Hatırlayalım

Visitor kalıbına hangi durumda ihtiyaç duyabiliriz? Bir nesne yapısı üzerinde işlemler yapmak istiyoruz ve bu işlemlerin üzerinde çalıştığı nesne yapısından bağımsız olarak çeşitlenmesini istiyoruz. Bu durumda Visitor kalıbı işimize yarayabilir. Aşağıdaki örnekte bir arabanın parçaları üzerinde clean ve repair işlemleri yapılıyor:

public interface CarElement {
    void accept(CarElementVisitor visitor);
}

public interface CarElementVisitor {
    void visit(Engine engine);
    void visit(Wheel wheel);
}

public class Car implements CarElement {

    private Engine engine;
    private List wheels;

    public Car(Engine engine, Wheel... wheels) {
        this.engine = engine;
        this.wheels = Arrays.asList(wheels);
    }

    @Override
    public void accept(CarElementVisitor visitor) {
        engine.accept(visitor);
        for (Wheel wheel : wheels) {
            wheel.accept(visitor);
        }
    }
}

public class Engine implements CarElement {
    @Override
    public void accept(CarElementVisitor visitor) {
        visitor.visit(this);
    }
}

public class Wheel implements CarElement {
    @Override
    public void accept(CarElementVisitor visitor) {
        visitor.visit(this);
    }
}

public class CleaningVisitor implements CarElementVisitor {
    @Override
    public void visit(Engine engine) {
        System.out.println("Cleaning engine!");
    }

    @Override
    public void visit(Wheel wheel) {
        System.out.println("Cleaning wheel!");
    }
}

public class RepairingVisitor implements CarElementVisitor {
    @Override
    public void visit(Engine engine) {
        System.out.println("Repairing engine!");
    }

    @Override
    public void visit(Wheel wheel) {
        System.out.println("Repairing wheel!");
    }

    @Override
    public void visit(Car car) {
        System.out.println("Repairing car!");
    }
}

public class Program {

    public static void main(String[] args) {

        Engine engine = new Engine();
        Wheel wheel1 = new Wheel();
        Wheel wheel2 = new Wheel();

        Car car = new Car(engine, wheel1, wheel2);

        CarElementVisitor cleaningVisitor = new CleaningVisitor();
        CarElementVisitor repairingVisitor = new RepairingVisitor();

        car.accept(cleaningVisitor);
        car.accept(repairingVisitor);
    }

}

Burada Car sınıfına baktığımızda, üzerindeki "visit" işleminden haberdar fakat Cleaning ve Repairing gibi ayrıntılardan habersiz. Yani, kendi nesne yapısı üzerinde işlemlerin yapılabilmesini sağlıyor ve hatta hangi parçaları üzerinde işlemlerin yapılacağını belirliyor. Fakat işlemlerin somut sınıflarına bağımlı değil. Sadece CarElementVisitor arayüzüne bağımlı. 
Visitor sınıfları ise, Car sınıfının parçaları üzerinde yapılacak işlemin ayrıntılarını biliyor. 


Comments

Popular posts from this blog

Trie Data Structure and Finding Patterns in a Collection of Words

My Crappy Looking Solution to "Binary Tree Common Ancestor" Problem

A Graph Application in Java: Using WordNet to Find Outcast Words