首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

类中方法返回对象是否破坏封装原则?解决方法

2012-02-01 
类中方法返回对象是否破坏封装原则?//大家好!类中方法返回对象是否破坏封装原则?先看以下代码://Map中含有

类中方法返回对象是否破坏封装原则?
//大家好!类中方法返回对象是否破坏封装原则?先看以下代码:
//Map   中含有Point类对象,Map有一方法getPt()返回Point对象
//file   Point.java
public   class   Point
{
        private   int   x;
        private   int   y;
       
        public   int   getX()
        {
                return   x;
        }
        public   int   getY()
        {
                return   y;
        }

        public   void   setX(int   x)
        {
                this.x   =   x;
        }
        public   void   setY(int   y)
        {
              this.y   =   y;
        }
}

//file   Map.java
public   class   Map
{
        private   Point   pt;
       
        public   void   setPt(Point   pt)
        {
                this.pt   =   pt   ;
        }
        public   Point   getPt()
      {
                return   pt;
      }

}

//file   TestMap.java
public   class   TestMap
{
          public   static   void   main(String   []   arg)
          {
                    Map         mp   =   new   Map();
                    Point     pta   =   new   Point();
                    pta.setX(5);
                    pta.setY(10);
                    mp.setPt(pta);                    
                    System.out.println( "before   chage   map 's   point   is: ");
                    System.out.println(mp.getPt().getX()   +   ", "   +   mp.getPt().getY());
                   
                    Point   ptb   =   mp.getPt();
                    ptb.setX(1);//此处直接用返回的对象引用改变类Map中的Point;
                    ptb.setY(1);
                    System.out.println( "after   chage   map 's   point   is: ");
                    System.out.println(mp.getPt().getX()   +   ", "   +   mp.getPt().getY());


//Map   里的private   point变为(1,1),但我是没有通过Map的setPt方法改的,
//而是通过返回的类成员直接改变,这样java是否违背类私有成员要由类方法来改变
//这一封装原则??   还是这原则要由程序员注意保护?

          }
}

[解决办法]
不算。setX不就是类方法么?只不过不是Map的而已。其实这个问题涉及的是另一个问题。就是方法参数的问题,方法参数原则上应该是简单的。也就是类似基本类型或者String这样的基础类的
,但是在初始化时,太多的简单参数又会造成另一种程度封装不足。所以现在在构造对象的时候经常会用一些bean对象来快速填充。但是在取数据时,应该尽量返回简单的类型。比如Map类,可以考虑增加函数getPtX和getPtY来代替getPt。
[解决办法]
这样的确违反了封装原则。但是,用公开的set,get方法来影响私有属性也有一定的意义。就是在继承中,子类可以用继承下来的set,get方法来影响父类中的私有属性。父类就能保持相对的独立性,而子类引用set,get获得属性可以明显的让程序员知道,这些属性并不是子类负责处理的。
返回clone也是可以的.但是,我认为,既然父类申明为私有的属性,就应当依靠父类的方法处理、加工、引用这个私有属性。而他的子类并不应当直接来处理这个父类的私有属性。从这个意义上讲,返回的对象并不是一个clone也不是非常严重的问题。
如果父类和子类都需要共同处理同一个属性,那么可以考虑protected了。

热点排行