Balking minta

A Wikipédiából, a szabad enciklopédiából

A balking (akadályozó) egy konkurens programtervezési minta, ami csak akkor engedi az általa védett objektumon egy művelet végrehajtását, ha az objektum megengedett állapotban van. Például, ha az objektum ZIP fájlokat olvas, akkor az akadályozó lepattintja a klienst, ha a fájl nincs megnyitva. Javában például egy IllegalStateException típusú kivételt dobhat.

Egyes szakértők szerint ez antiminta, és nem ajánlják használatát, helyette az API megfelelő kidolgozását javasolják. Vagy olyan korlátozásokat kell bevezetni, amelyek kizárják, hogy a műveletet meg nem engedett állapotú objektumon hívják, vagy úgy kell megírni, hogy a műveletet bármilyen állapotban meg lehessen hívni. Ez a következőképpen érhető el:

  • Az objektum a létrehozás után megengedett állapotban van.
  • Az objektum elérhetetlen, amikor nincs megengedett állapotban.
  • Homlokzat tervezési minta alkalmazásával több objektumot használunk, és ezek közül a homlokzat mindig egy megengedett állapotú objektumnak továbbítja a kérést.

Felhasználása[szerkesztés]

Az akadályozó által védett objektum olyan, hogy meghatározatlan ideig maradhat meg nem engedett állapotban. Ha a meg nem engedett állapot ismert ideig tart, akkor inkább az őrzött felfüggesztés javasolható.

Megvalósítása[szerkesztés]

Alább a tervminta leegyszerűsített, általános megvalósítása látható.[1] A fenti definíció szerint érdemes ránézni arra a részlethez, ahol a synchronized kulcsszó is található. Ha több hívás érkezik, akkor csak egy haladhat tovább, míg mások semmivel térnek vissza. Egy másik figyelemre méltó hely a jobCompleted() hívás. A szinkronizációra azért van szükség, hogy a többi szál láthassa a mező változását.

public class Example {
    private boolean jobInProgress = false;

    public void job() {
        synchronized(this) {
           if (jobInProgress) {
               return;
           }
           jobInProgress = true;
        }
        // Code to execute job goes here
        // ...
    }

    void jobCompleted() {
        synchronized(this) {
            jobInProgress = false;
        }
    }
}

Jegyzetek[szerkesztés]

  1. Grand, Mark. Patterns in Java, Volume 1: A Catalog of Reusable Design Patterns Illustrated with UML, Second Edition. Indianapolis, Ind: John Wiley & Sons (2002) 

Fordítás[szerkesztés]

Ez a szócikk részben vagy egészben a Balking pattern című angol Wikipédia-szócikk fordításán alapul. Az eredeti cikk szerkesztőit annak laptörténete sorolja fel. Ez a jelzés csupán a megfogalmazás eredetét és a szerzői jogokat jelzi, nem szolgál a cikkben szereplő információk forrásmegjelöléseként.