有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java什么时候应该使用封装?

我正在完成Sun/Oracle的跟踪(http://docs.oracle.com/javase/tutorial/java/TOC.html),它不断重申封装的重要性

封装到底有多重要?我的意思是,如果我可能需要访问给定类字段的值,为什么我要通过一个方法来访问,而我可以直接访问该字段?既然字段将通过其相应的对象访问,那么这到底会出什么问题呢

它只是为了代码扩展的目的吗?换句话说,因为在将来,如果我决定在返回字段之前以某种方式修改或清理字段,我可以吗

我更想找一两个例子


共 (3) 个答案

  1. # 1 楼答案

    封装不仅仅是为字段制作getter和setter

    它是关于:

    • 验证(以及一致性)
    • 隐藏实现(编程到接口而不是实现)
    • 能手和二传手不必反映出敏锐的领域。对于值是按需计算的字段,可能会有getter(甚至setter)
    • 隐藏复杂性:一个getter/setter可以形成比仅仅设置一个值更复杂的东西
    • 高级:使用不同的实现/修改;如果要使用公共字段,ORM框架中使用的类似于延迟加载的模式将不起作用

    即使如您所说的“需要访问给定类字段的值”,您也不能确定此要求不会更改(因为大多数情况下会更改)

  2. # 2 楼答案

    验证

    如果不使用方法,则无法在字段上添加任何验证,除非在每个要访问字段的位置进行验证:不可持续

    它还将数据从课堂与外部世界分离。通过将数据的实际实现隐藏在方法后面,您可以按照自己想要的方式(现在和将来)操作数据,而不会破坏其他代码片段。这允许您在没有问题的情况下更改某些内容的表示方式,只要您确保它仍然可以通过现有方法返回

  3. # 3 楼答案

    封装允许对象控制自己的数据,从而使调试变得相当容易,从而使对象能够保证(对象的契约的一部分)。考虑这个类:

    public class TravelRoute {
        public int distance = 1000;
        public int travelSpeed = 60;
    
        public int calculateTravelTime() {
            return distance / travelSpeed;
        }
    }
    

    任何其他代码都可以自由地将travelSpeed设置为零,这将导致以后对calculateTravelTime方法的所有调用都失败。更糟糕的是,您将无法知道是谁将其设置为零,因此调试问题将需要很长时间

    然而,通过封装,类可以完全控制该值,并且可以保证它始终有效:

    public class TravelRoute {
        private int distance = 1000;
        private int travelSpeed = 60;
    
        /**
         * This is GUARANTEED to return a positive value.
         */
        public int getTravelSpeed() {
            return travelSpeed;
        }
    
        /**
         * Sets this instance's travel speed.
         *
         * @throws IllegalArgumentException if argument is not positive
         */
        public void setTravelSpeed(int newSpeed) {
            if (newSpeed <= 0) {
                throw new IllegalArgumentException("Argument must be positive");
            }
            this.travelSpeed = newSpeed;
        }
    
        public int calculateTravelTime() {
            return distance / travelSpeed;
        }
    }
    

    现在,任何外部代码都不可能将对象置于无效状态。如果有人试图这么做,产生的IllegalArgumentException将为您提供一个信息丰富的堆栈跟踪,该跟踪将立即暴露罪魁祸首

    作为奖励,所有使用该类的其他代码不再需要对其有效性进行任何检查,因为对象本身已经可以保证其有效性。这使得每个人的整体发展都要快得多