ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

这是一个很好的做法,使用“默认”Java访问来隐藏客户端的类和方法

2019-06-14 01:49:27  阅读:120  来源: 互联网

标签:java oop access-modifiers


>在课程的情况下:

如果我们使用工厂方法,我们必须将创建的实现作为已实现接口的类型返回.

public class Factory {

  public Product getProduct() {
    return new ProductA();
  }
}
public interface Product {
}
class ProductA implements Product {
}

为了避免客户能够将退回的产品转换为产品{A,B,C …等}的具体实现,我们必须:

>分别打包客户端和工厂代码(比如com.example.client和com.example.factory)
>使用默认(“包”)访问声明具体实现(对Factory可见,对客户端不可见)

    package com.example.client;
    ...
    public class Client {
      public static void main(String[] args) {
        Product i = new Factory().getProduct();
        ProductA a = (ProductA) i; // the type of ProductA isn't visible.
      }
    }

>在方法的情况下:

例如,我们需要使用隐藏方法的同一工厂

public class Factory {

  public Product getProduct() {
    return new ProductA();
  }

  Product[] getCreatedProducts() {
    ...
  }
}

我在这里看到两个问题:

>糟糕的包结构:隐藏的类和方法必须与调用代码在一个包中.
>糟糕的代码:不太直观和易懂.将java文件替换为另一个包很容易.

解决方法:

“默认”访问并不保证任何东西,因为任何流氓程序员都可以在你的包中声明他们的类.另外,无论你的包结构如何,在java中,你几乎总是可以做一个“实例”检查,然后向下转换为“实例”类型.因此,如果您的目标是阻止任何向下转发,则必须使用private关键字.例如,您可以将Product接口的具体实现声明为私有静态或工厂内的匿名内部类.事实上,在布洛赫的“如何设计一个好的API”文章中,他指出你应该“尽量减少一切的可访问性”.

那就是说,我觉得你在这里有点偏执.如果有人垂头丧气,对你来说真的很重要吗?您编写的任何代码都可能被滥用,当然如果您包含一个记录良好的工厂,那么您已经提供了有关如何正确使用API​​的明确信息.此外,如果你构建一个真正的工厂方法,它接受参数并且具有清晰的方法名称,而不是这个不带参数的玩具工厂示例,那么我认为你会发现你正在广播正在创建的公共相关部分无论如何.

标签:java,oop,access-modifiers
来源: https://codeday.me/bug/20190614/1236438.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有