2016-04-19 10 views
1

SeatPlanクラスの保護されたフィールドにアクセスし、その値をClassroomクラスから変更することができます。他のクラスの保護フィールドへのアクセス

これは正常ですか?保護されたフィールドにはそのサブクラスのみでアクセスできますか?それ以外の場合は、privateフィールドに変更する必要がありますか?


のは、私はprotected分野でabstractクラスがあるとしましょう:

public abstract class SeatPlan { 
    protected int rowNum; 
    protected int columnNum; 

    public abstract void method(); 
} 

そして、それは子クラスがあります。

public class ASeatPlan extends SeatPlan { 
    public ASeatPlan(){   // constructor 
     this.rowNum= 10; 
     this.columnNum = 7; 
    } 
    // omitted code 
} 

public class BSeatPlan extends SeatPlan { 
    public BSeatPlan(){   // constructor 
     this.rowNum= 7; 
     this.columnNum = 15; 
    } 
    // omitted code 
} 

クラスRoomSeatPlanオブジェクトのprivateフィールドが含まれています

public class Room { 
    private SeatPlan seatPlan; 

    public Room(SeatPlan seatPlan){  // constructor 
     this.seatPlan = seatPlan; 
    } 

    public SeatPlan getSeatPlan(){  // getter method 
     return seatPlan; 
    } 

    //omitted code 
} 

public class Classroom { 
    public SeatPlan doSomething(Room room){ 
     SeatPlan seats = Room.getSeatPlan(); 
     seats.rowNum = 99999;  <--------------- accidentally change the value ------ 

    //omitted code 
    } 
+2

可能な複製(http://stackoverflow.com/questions/215497/difference-among -public-default-protected-and-private) – Savior

+0

アクセス修飾子を理解する必要があります。 簡単なチュートリアルはここにあります:http://www.tutorialspoint.com/java/java_modifier_types.htm あなたのコードのための簡単な解決策は、すべての人のために修飾子を使用する方法を知る必要があるので、単一のJavaプロジェクト。 – goncalopinto

答えて

0

あなたはC#をJavaと混同していると思います。

C#では、protectedのものはサブクラスのみでアクセスできます。しかし、Javaでは、protectedのものは、同じパッケージまたはサブクラスでアクセスできます。

そのため、教室から座席表の価値を変更することができます。

これは安全ではありませんか?

IMOです。座席表の行番号と列番号を変更する必要はないと思います。

どうすれば安全にすることができますか?

シートプランクラスを再設計する必要があります。ここでは大まかなアイデアです:[「公共」、「デフォルト」、「保護」の間の違い、および「民間」]の

public final class SeatPlan { 
    private SeatPlan(int rowNum, int colNum) { 
     this.rowNum = rowNum; 
     this.colNum = colNum; 
    } 

    private int rowNum; 
    private int colNum; 

    //You should add getters for rowNum and colNum here 
    //But I'm lazy so I did not do it for you 

    public static final SeatPlan PLAN_A = new SeatPlan(10, 7); 
    public static final SeatPlan PLAN_B = new SeatPlan(7, 15); 
} 
関連する問題