标签 Java 下的文章

1 Chrome 还有打击广告拦截器的下一个武器

为了打击浏览器上的广告拦截器,Chrome 不但计划在 2024 年 6 月推出限制广告拦截的 Manifest V3 扩展平台,而且还会限制扩展更新过滤规则的方式,以延迟扩展开发者快速响应变化的能力。YouTube 可以立即更换广告投放系统,但一旦 Manifest V3 成为强制规定,扩展开发者就无法立即做出响应。如今,广告拦截器和隐私应用可以自行更新过滤列表,通常使用的是巨大的开源社区的列表。Manifest V3 将通过限制谷歌所说的 “远程托管代码” 来阻止这种情况。所有更新,即使是像过滤列表这样的良性更新,都需要通过 Chrome 商店进行全面的扩展更新。这些更新都需要经过 Chrome 网上应用商店的审核过程,而这将带来很大的时间延迟。

消息来源:Ars Technica
老王点评:对谷歌的反垄断审查更严厉些吧。

2 Java 尝试使用多线程的新方法

在 Java 21 的预览版本中,Java 尝试了多线程的新方法:结构化并发。该方法允许开发者使用结构化编程语法来使用多个线程。从本质上讲,它提供了一种使用熟悉的程序流程和结构编写并发软件的方法。这样,开发人员就可以专注于手头的业务,而不是线程的协调。虚拟线程现已成为 Java 的一项正式功能,它为廉价生成线程以获得并发性能提供了可能。结构化并发为此提供了简单的语法。因此,Java 现在拥有了一个独特的、高度优化的、易于理解的线程系统。

消息来源:Info World
老王点评:这是一个很好的消息,值得关注。

3 研究称 GPT-4 没有通过图灵测试

在一篇题为 《GPT-4 通过图灵测试了吗?》的预印本研究论文中,研究人员将 GPT-4 人工智能语言模型与人类参与者、GPT-3.5 和 ELIZA 进行了对比。其中,ELIZA 是一个上世纪 60 年代开发的基于规则的对话程序。研究人员建立了一个名为 turingtest.live 的网站,他们在该网站上通过互联网举办了一场双人图灵测试。通过该网站,人类审讯者与代表其他人类或人工智能模型的各种 “人工智能证人” 进行互动。令人惊讶的是,ELIZA 在研究中得分相对较高,成功率达到 27%,超过了 GPT-3.5 的 14% 成功率。GPT-4 的成功率为 41%,但就连 GPT-4 也不符合图灵测试的成功标准,既没有达到 50% 的成功率,也没有超过人类参与者的成功率。

消息来源:Ars Technica
老王点评:虽然这个结果令人吃惊,但是我倾向于研究方法有误,比如没有很好地设计符合 GPT 方式的提示语。

甲骨文的新 Java 许可条款将增加 2-5 倍费用

据 Gartner 公司估计,大多数企业在接受甲骨文公司新的 Java 许可条款时,预计按员工订阅模式的成本将是传统模式的两到五倍。新模式以每个员工的消耗量为基础,而不是以前的每个处理器或每个用户的消耗量。这同时意味着到 2026 年,80% 以上的 Java 应用程序将部署在第三方 Java 运行时上,而 2023 年这一比例仅为 65%。Gartner 还警告说,甲骨文公司已经准备好测试用户是否遵守它所认为的 Java 许可条款,预计 1/5 的 Java 用户会在未来三年内接受甲骨文的审计。

消息来源:The Register
老王点评:Java 真是一只下金蛋的鸡,但是现在它一天要下一只是不行的了。

FCC 建议新的宽带标准

美国联邦通信委员会(FCC)主席提出了一项新的宽带标准,即下载速度为 100Mbps,上传速度为 20Mbps,以取代 2015 年的 25Mbps/3Mbps 标准。根据她的计划,FCC 将评估宽带的可用性、速度和价格,以决定是否采取监管措施来促进网络部署和竞争。FCC 还将为未来设定一个 1Gbps/500Mbps 的目标。

消息来源:Ars Technica
老王点评:新的带宽目标,将带来新的基础设施,而新的基础设施是更多应用的基础,比如 AR/VR/XR 等,以及 AI。

OpenAI 悄然关闭其人工智能检测工具

今年 1 月,人工智能巨头 OpenAI 发布了一款工具,它可以通过检测内容是否使用了生成式人工智能工具(比如它自己的 ChatGPT)来创建。半年后,这个工具死了,原因是 “它的准确率很低”,但这一解释并没有出现在新的公告中,而是添加到了首次发布该工具的博客文章的注释中。

消息来源:Decrypt
老王点评:AI 工具无法识别 AI 输出的内容。还有什么能束缚 AI 的发展?

Auto-GPT 将人工智能“套娃”

最近,一个名为 AutoGPT 的新人工智能工具发布了,它比 ChatGPT 更有潜力。它可以执行人类级别的任务,并利用 GPT-4 的能力来开发一个可以独立运作而不受用户干扰的 AI 代理。它是一个实验性的、开源的 Python 应用程序,它使用 ChatGPT/GPT-4 来自主地行动。AutoGPT 使用“套娃”的概念来递归地调用自己,这是一种让 AI 模型使用其他模型作为工具或媒介来完成任务的方法。AutoGPT 使用这种方法,并在 ChatGPT 和 GPT-4 的帮助下,通过迭代自己的提示创建完整的项目。人们称,Auto-GPT 是通用人工智能(AGI)的第一个真正的缩影。

消息来源:Mark Tech Post
老王点评:虽然距离 AGI 还有距离,但是能“自动”解决问题的 AI,距离下一步可以自主运行的 AI 又有多远呢?

Java 21 的一个提案将使它更容易学习

计划在 9 月发布的 JDK 21 中有一个默认禁用的预览语言功能,它提议在 Java 中引入灵活的 main 方法和匿名 main 类,这将使 Java 变得更容易被学习。根据该提案,它将允许省略 main 方法的 String[] 参数,并允许 main 方法既不公开也不静态;引入匿名 main 类,声明隐含 main 类。比如 Hello World 程序只需要这样一行:void main() { System.out.println("Hello, World!");}

消息来源:Info World
老王点评:这样的 Java 是不是看起来平易近人多了?

西部数据被窃取到了 10 TB 数据

西部数据本月初证实它在 3 月 26 日遭到入侵,但没有透露更多信息。参与此次攻击的一名黑客公开接受采访,披露了更多相关信息。黑客称他们从西部数据窃取到了大约 10 TB 数据,正在谈判索要至少八位数的赎金。作为证据,黑客分享了一份使用西数证书签名的文件,以证明他们已经获取到了该证书。黑客表示他们入侵的目的是获利,因此没有用勒索软件加密西数的文件,如果西数拒绝或不理睬他们的要求,他们将会公开西数的数据。

消息来源:Tech Crunch
老王点评:根据另外一份报告,83% 的企业被勒索后都会先期支付部分赎金。

俄罗斯开发者被阻止向“自由及开源软件”贡献

最近有两起俄罗斯开发者被阻止贡献 FOSS 代码的事件。在 Linux 内核邮件列表上,俄罗斯芯片制造商贝加尔电子公司的 Sergey Semin 的贡献被拒绝了,“我们对接受来自贵组织生产的硬件或与之相关的补丁感到不舒服。”另外一件也是针对俄罗斯开发者的,他的 GitHub 账户已被封锁。他开发的 “一个管理和配置支持智能平台管理界面的设备的工具”,ipmitool,被标记为只读“存档”。原因是他为俄罗斯芯片制造商 Yadro 工作,该公司正在研发 RISC-V 芯片,被列入了乌克兰的战争与制裁数据库。

消息来源:The Register
老王点评:GitHub 倒也罢了,那毕竟是一家美国公司。Linux 内核,FOSS ?!呵呵。

现代汽车承诺在汽车中保留实体按钮

这是一个源于安全考虑的决定,现代汽车公司的设计主管说,“对我来说,与安全有关的按钮必须是一个硬键,……很容易感知和感觉到它”。但未来的情况可能会发生变化。特别是,当自动驾驶成为主流时,该公司可能会更多地考虑使用触摸控制。“当涉及到 4 级自动驾驶时,那么我们将拥有一切软键。”

消息来源:The Drive
老王点评:现在有些汽车你都找不到什么按键和旋钮,真当自己的软件系统万无一失吗?

甲骨文公司宣布推出 Java 20

这个有 27 年历史的语言的最新版本包括数以千计的性能、稳定性和安全性方面的改进,并对 Java 开发工具包提出了 7 项增强建议。甲骨文公司在过去的五年中,每六个月推出一个新的 Java 版本,并说它是这个开源项目的最大贡献者,在 Java 开发组织中排名第一。Java 的开发分为六个项目,分别针对性能和功能的不同方面,如使其更加简洁和不容易出错、改善启动时间和性能、实现大规模并行等等。今年 9 月将发布的 Java 21 将是每两年一个的 LTS 版本。

消息来源:Silicon Angle
老王点评:Java 是不错,就是被当成下金蛋的母鸡了。

甲骨文新的授权模式导致 Java 使用成本激增

甲骨文公司修改了 Oracle Java SE 订阅模式,在新的模式下,Java 将按每个员工授权,而不是像旧模式允许的那样按每个用户或每个处理器授权。尽管甲骨文公司承诺允许用户可以根据他们目前的订阅模式进行续约,但随着时间的推移,它可能会对用户施加压力,让他们采用新的模式。这种转变将惩罚那些花了多年时间尽量减少 Java 使用量的公司,因为他们发现无论他们使用多少Java,都要按员工收费。有分析称,有的公司的 Java 成本上升了 10 倍,平均在 2 到 4 倍的增长。

消息来源:The Register
老王点评:是时候抛弃甲骨文的 Java 了。

GitHub 用户数突破 1 亿

成立于 2008 年的 GitHub 宣布,现在有 1 亿名开发者在使用该平台。与 GitHub 十年前的 300 万用户、五年前微软以 75 亿美元收购它时声称的 2800 万用户,以及三个月前透露的 9000 多万用户相比,这一数字有了大幅提升。在 2019 年的一次主题演讲中,其前 CEO 说,该公司的目标是到 2025 年达到 1 亿名开发者,所以实际上是提前两年达成了目标。

消息来源:Tech Crunch
老王点评:要不是在某些地方访问 GitHub 经常性抽风,可能 GitHub 能更快完成这一目标吧。

ChatGPT 在寻找和解决程序错误方面表现优异

研究人员将 40 段有错误的代码交给四个不同的代码修复系统:ChatGPT、Codex、CoCoNut 和标准 APR(自动程序修复)。在第一轮测试中,ChatGPT 解决了 19 个问题,Codex 解决了 21 个,CoCoNut 解决了 19 个,而标准 APR 方法则解决了 7 个。然而,通过和 ChatGPT 对话,提供了有关问题和错误的更多信息后,最终 ChatGPT 解决了 31 个问题。

消息来源:《PC 杂志》
老王点评:看看,不仅仅能写程序,还能替你挑错,甚至修改错误,所以,程序员们可能真的快被淘汰了。

在这个简便的教程中,我们可以了解到 Java 中方法的定义,如何使用方法,以及何时使用方法。

Java 中的方法(在许多其他编程语言中称为“函数”)是被组合在一起并标记为可重用的一块代码。方法很有用,因为它们允许你在不重写相同代码的情况下,执行相同的操作或一系列操作,这不仅意味着你的工作量减少,还意味着出现问题时需要维护和调试的代码减少。

方法存在于类中,因此标准 Java 样板代码适用:

package com.opensource.example;

public class Example {
  // 在此写代码
}

在这样一个简单的单文件应用程序中,包定义并不是绝对必要的,但它是一个很好的习惯,而且大多数 IDE 都强制执行它。

默认情况下,Java 会寻找在类中运行的 main 方法。方法可以是公有的或私有的,也可以是静态的或非静态的,但 main 方法必须是公有的、静态的,Java 编译器才能识别和使用它。当方法是公有的时,它可以从类外部执行。要在程序启动时调用 Example 类,其 main 方法必须是可访问的,因此将其设置为 public

下面是两个方法的简单演示:一个 main 方法在调用 Example 类时默认执行,另一个 report 方法接受 main 的输入并执行简单操作。

为了模拟任意数据输入,我使用了 if-then 语句,该语句根据你启动应用程序的时间在两个字符串之间进行选择。换句话说,main 方法首先设置一些数据(在现实生活中,这些数据可以来自用户输入,也可以来自应用程序其他地方的其他方法),然后 “调用” report方法,将处理后的数据作为输入提供:

package com.opensource.example;

public class Example {
  public static void main(String[] args) {
    // 生成一些数据
    long myTime = System.currentTimeMillis();
    String weather;

    if ( myTime%2 == 0 ) {
      weather = "party";
    } else {
      weather = "apocalypse";
    }

    // 调用其他方法
    report(weather);
  }

  private static void report(String day) {
    System.out.printf("Welcome to the zombie %s\n", day);
  }
}

运行代码:

$ java ./Example.java
Welcome to the zombie apocalypse
$ java ./Example.java
Welcome to the zombie party

请注意,同一 report 方法有两个不同的结果。当然,在这个简单的演示中,不需要第二种方法。模拟数据生成的 if-then 语句可能生成了相同的结果。但是,当一个方法执行一项复杂的任务时,比如将图像调整为缩略图,然后使用调整后的图像在屏幕上生成小部件,那么附加组件的“费用”就很有意义了。

何时使用 Java 方法

很难知道何时使用方法,何时只将数据发送到 Java 流 或循环中。如果你面临这个决定,答案通常是使用一种方法。原因如下:

  • 方法开销少。它们不会给代码增加处理开销。
  • 方法减少代码的行数。
  • 方法是特定的。查找名为 resizeImage 的方法通常比查找隐藏在从驱动器加载图像的函数中某个循环中的代码更容易。
  • 方法是可重用的。当你第一次编写方法时,你可能会 认为 它只对应用程序中的一个任务有用。然而,随着应用程序的编写,你可能会发现自己正在使用一种你认为“已完成”的方法。

函数式编程与面向对象编程

函数式编程利用方法作为执行任务的主要构造。创建一个方法,该方法接受一种数据,处理该数据,并输出新数据。将许多方法串在一起,你就拥有了一个动态且功能强大的应用程序。像 C 和 Lua 这样的编程语言就是这种编码风格的例子。

用代码完成任务的另一种方式是 Java 使用的面向对象模型。在面向对象编程中,方法是模板的组成部分。你可以创建对象,而不是将数据从一个方法发送到另一个方法,并可以通过使用它们的方法来更改它们。

从面向对象的角度来看,这是一个简单的 “僵尸末日” 演示程序。在函数方法中,我使用一种方法生成数据,另一种方法使用该数据执行操作。面向对象的等价物是具有表示工作单元的类。这个示例应用程序向用户显示一条当天的消息,宣布这一天会有僵尸派对或是僵尸末日。编写一个“天”对象,然后查询该对象以了解其特性是有意义的。作为演示面向对象构造的不同方面的借口,新的示例应用程序还将统计有多少僵尸出现在派对上(或末日)。

Java 为每个类使用一个文件,因此要创建的第一个文件是 Day.Java,它用作 Day 对象:

package com.opensource.example;

import java.util.Random;

// 类
public class Day {
    public static String weather;
    public int count;

// 构造方法
  public Day() {
    long myTime = System.currentTimeMillis();

    if ( myTime%2 == 0 ) {
      weather = "paradise";
    } else {
      weather = "apocalypse";
    }
  }

// 方法
  public String report() {
      return weather;
  }

  public int counter() {
    Random rand = new Random();
    count = count + rand.nextInt(100);

    return(count);
    }
}

在“类”部分中,创建了两个域:天象 weather 和计数 countweather 是静态的。在一天的过程中(在这种假想的情况下),weather 不会改变。要么是派对 paradise,要么是末日 apocalypse,持续了一整天。然而,僵尸的数量在一天中会增加。

在“构造方法”部分,确定当天的天象。它是作为一个 构造方法 完成的,因为它只在类最初被调用时发生一次。

在“方法”部分,report 方法只返回由构造方法确定和设置的天象报告。然而,counter 方法生成一个随机数,并将其添加到当前僵尸计数中。

换句话说,这个类做了三件不同的事情:

  • 表示应用程序定义的“天”。
  • 设置当天不变的天气报告。
  • 设置一天中不断增加的僵尸数量。

要使用这所有,请创建第二个文件:

package com.opensource.example;

public class Example {
  public static void main(String[] args) {
    Day myDay = new Day();
    String foo = myDay.report();
    String bar = myDay.report();

    System.out.printf("Welcome to a zombie %s\n", foo);
    System.out.printf("Welcome to a zombie %s\n", bar);
    System.out.printf("There are %d zombies out today.\n", myDay.counter());
    System.out.printf("UPDATE: %d zombies. ", myDay.counter());
    System.out.printf("UPDATE: %d zombies. ", myDay.counter());
  }
}

因为现在有两个文件,所以使用 Java IDE 运行代码是最简单的,但是如果不想使用 IDE,可以创建自己的 JAR 文件。运行代码以查看结果:

Welcome to a zombie apocalypse
Welcome to a zombie apocalypse
There are 35 zombies out today.
UPDATE: 67 zombies. UPDATE: 149 zombies.

无论调用 report 方法多少次,weather 都保持不变,但调用 counter 方法的次数越多,僵尸的数量就会增加。

Java 方法

方法(或函数)是编程中的重要组成。在 Java 中,你可以将它们作为函数式编程的单个类的一部分使用,也可以在面向对象编程的类之间使用它们。两种类型的编程对于解决同一个问题有不同的视角,因此没有对与错之分。通过反复尝试,积累一点经验,你会知道哪一个最适合某个特定的问题。


via: https://opensource.com/article/23/1/java-methods

作者:Seth Kenlon 选题:lkxed 译者:ZhangZhanhaoxiang 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出