- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以基本上这个线程归结为我想要一些私有(private)方法来表示另一个方法中的代码块。我知道 Java 中作用域的工作原理,但有时我希望事情能以不同的方式工作:
假设我的类中有一个方法doLotsOfStuff(),它可以做不止一件事。自然地,人们会将事物分为几种 VOID 类型的方法 doThis() 和 doThat()。您遇到此类问题:
1) 如果没有首先,我无法再在 doThis() 和 doThat() 中对 doLotsOfStuff() 中定义的任何数据进行操作传递所有必要的参数,这不会使它们无效!例如doThis(int doLotsOfStuffsInt)这意味着如果我想要一系列调用,则必须在一行参数中传递相同的变量。 ..这导致了这个:
2) doThis() 和 doThat() 设置为 private 对于同一类中的所有其他方法仍然可见,即使我只想使用它们对于doLotsOfStuff()。拥有一长串只打算使用一次的子方法现在会使整个类变得困惑。
这是我希望存在的:a、b、c、d 是同一类中的私有(private)方法。 -> 表示对方法的调用。
a() -> b() -> c()
c() 可以自由使用 a() 或 b() 中的变量,而无需在链上传递参数。
d() -/-> c()
c() 不能被 d() 调用,因为 c() 对于 a() 及其任何后续调用者来说只是“本地”的。
考虑这个简短的例子:
private void someMethod()
{
char a = 'a';
printA();
}
private void printA() {
System.out.println(a); //a cannot resolve, but I don't want to pass it as an argument from someMethod()!
}
有没有一种方法可以实现这一点,而不必传递 a 作为参数?某种声明的行“private void printA() 取决于 someMethod”?
这不是一个很好的功能吗?如果没有,为什么?你会怎么做?
最佳答案
闭包
在Java
中并不是原生支持的,老实说模仿起来也不是很优雅。这种能力是大多数动态语言(例如 Groovy
或 JavaScript
一个Closure
捕获其定义范围内的变量。
If you use final
references您可以在内部类中引用它们,并使用内部类在闭包
中模仿数据隐藏的行为。
public class Q32766010
{
public static void main(final String[] args)
{
final Example e = new Example();
e.doSomething(23,42);
}
public static class Example
{
public void doSomething(final int a, final int b)
{
class ClosureLikeThing {
ClosureLikeThing doThis() { System.out.println("a = " + a); return this; }
ClosureLikeThing doThat() { System.out.println("b = " + b); return this; }
}
new ClosureLikeThing().doThis().doThat();
}
}
}
a = 23
b = 42
这将隐藏您正在寻找的数据/方法。它是一个方法对象模式的实现可能会困扰新程序员,因为它在 Java 中并不经常使用。这种内部类的用法在 Python、JavaScript 和 Ruby 等更动态的语言中很普遍。
这可以帮助您在支持代码折叠的优秀 IDE 中整理代码。如果您将 IDE 设置为折叠所有内部类,则会减少源代码吵闹。
更多行代码并不总是坏事,如果您使用像 Intellij IDEA 这样的工具更容易自动重构某些内容,那么更多行代码会更好,因为它可以自动维护。
多写几行代码来缩小范围几乎总是更好。范围越窄,可能的副作用就越少,并且更容易维护和调试,因为由于范围窄,该代码的影响以及该代码的影响都是最小的并且明显明显。
这个习惯用法在 Java 中主要用于诸如迭代器和 FluentBuilder 模式实现之类的事情,以隐藏实现的细节。这是一个例子'UrlBuilder' .
这以相同的方式工作,但如果您需要同一接口(interface)
的不同行为,则允许您创建多个实现。
public static class Example
{
interface ClosureLikeThing
{
public ClosureLikeThing doThis();
public ClosureLikeThing doThat();
}
public void doSomething(final int a, final int b)
{
new ClosureLikeThing()
{
@Override
public ClosureLikeThing doThis()
{
System.out.println("a = " + a);
return this;
}
@Override
public ClosureLikeThing doThat()
{
System.out.println("b = " + b);
return this;
}
}.doThis().doThat();
}
}
关于java - 如何有效地将一个方法划分为子方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32766010/
我想了解 Ruby 方法 methods() 是如何工作的。 我尝试使用“ruby 方法”在 Google 上搜索,但这不是我需要的。 我也看过 ruby-doc.org,但我没有找到这种方法。
Test 方法 对指定的字符串执行一个正则表达式搜索,并返回一个 Boolean 值指示是否找到匹配的模式。 object.Test(string) 参数 object 必选项。总是一个
Replace 方法 替换在正则表达式查找中找到的文本。 object.Replace(string1, string2) 参数 object 必选项。总是一个 RegExp 对象的名称。
Raise 方法 生成运行时错误 object.Raise(number, source, description, helpfile, helpcontext) 参数 object 应为
Execute 方法 对指定的字符串执行正则表达式搜索。 object.Execute(string) 参数 object 必选项。总是一个 RegExp 对象的名称。 string
Clear 方法 清除 Err 对象的所有属性设置。 object.Clear object 应为 Err 对象的名称。 说明 在错误处理后,使用 Clear 显式地清除 Err 对象。此
CopyFile 方法 将一个或多个文件从某位置复制到另一位置。 object.CopyFile source, destination[, overwrite] 参数 object 必选
Copy 方法 将指定的文件或文件夹从某位置复制到另一位置。 object.Copy destination[, overwrite] 参数 object 必选项。应为 File 或 F
Close 方法 关闭打开的 TextStream 文件。 object.Close object 应为 TextStream 对象的名称。 说明 下面例子举例说明如何使用 Close 方
BuildPath 方法 向现有路径后添加名称。 object.BuildPath(path, name) 参数 object 必选项。应为 FileSystemObject 对象的名称
GetFolder 方法 返回与指定的路径中某文件夹相应的 Folder 对象。 object.GetFolder(folderspec) 参数 object 必选项。应为 FileSy
GetFileName 方法 返回指定路径(不是指定驱动器路径部分)的最后一个文件或文件夹。 object.GetFileName(pathspec) 参数 object 必选项。应为
GetFile 方法 返回与指定路径中某文件相应的 File 对象。 object.GetFile(filespec) 参数 object 必选项。应为 FileSystemObject
GetExtensionName 方法 返回字符串,该字符串包含路径最后一个组成部分的扩展名。 object.GetExtensionName(path) 参数 object 必选项。应
GetDriveName 方法 返回包含指定路径中驱动器名的字符串。 object.GetDriveName(path) 参数 object 必选项。应为 FileSystemObjec
GetDrive 方法 返回与指定的路径中驱动器相对应的 Drive 对象。 object.GetDrive drivespec 参数 object 必选项。应为 FileSystemO
GetBaseName 方法 返回字符串,其中包含文件的基本名 (不带扩展名), 或者提供的路径说明中的文件夹。 object.GetBaseName(path) 参数 object 必
GetAbsolutePathName 方法 从提供的指定路径中返回完整且含义明确的路径。 object.GetAbsolutePathName(pathspec) 参数 object
FolderExists 方法 如果指定的文件夹存在,则返回 True;否则返回 False。 object.FolderExists(folderspec) 参数 object 必选项
FileExists 方法 如果指定的文件存在返回 True;否则返回 False。 object.FileExists(filespec) 参数 object 必选项。应为 FileS
我是一名优秀的程序员,十分优秀!