gpt4 book ai didi

Java:什么时候使用属性,什么时候使用方法参数?

转载 作者:搜寻专家 更新时间:2023-11-01 02:08:58 24 4
gpt4 key购买 nike

我尝试使用谷歌搜索并搜索这个问题,但不知何故找不到任何相关信息。我想知道是否有关于何时在类中使用属​​性以及何时不使用单个方法的参数的最佳实践指南。

很多情况我都很清楚,例如

public class Dog
{
private name;
public setName(...) {....}
}

但有时我不清楚使用什么更好。例如。以下,要么使用:

public class calculation
XYZ bla;
public calculation(XYZ something)
{
this.bla = something;
}
public void calc1()
{
// some calculations with this.bla
}
public void calc1()
{
// some more calculations with this.bla
}
public XYZ getBla()
{
return this.bla;
}
}

或者也许做:

public class calculation
public calculation() {}
public static XYZ calc1(XYZ bla) // maybe static, if not dependant on other attributes/instance-variables etc
{
// some calculations with bla
return bla;
}
public static XYZ calc1() // maybe static, if not dependant on other attributes/instance-variables etc
{
// some more calculations with bla
return bla;
}
}

我的意思是你可以为这两种情况争论不休。我看到了两种不同风格的优点和缺点,但不知何故我更喜欢第二种风格,只要不需要太多的参数/参数。当然,如果我需要更多属性等,那么第一个会更好、更简单等,因为我不需要向方法传递那么多参数...

只是个人风格的问题?或者如何决定采用一种方法?谢谢


编辑:一个更好的例子:我目前正在做很多图像处理,问题是是否将图像内部存储在对象的状态中。我目前没有这样做,因为我使用的是静态方法,并将图像本身 I psasing 到每个方法:

public class ImageProcessing
{
/**
*
*/
public static Mat cannyEdges(Mat I, int low, int high)
{
// ...
return I;
}
public static Mat cannyEdges(Mat I)
{
return ImageProcessing.cannyEdges(I, ContourDetection.CANNY_LOWTHRES, ContourDetection.CANNY_HIGHTHRES);
}

/**
*
*/
public static Mat getHoughLines(Mat Edges, ...some_conf_vars...)
{
// ...
return I;
}
}

然后我像这样从外部调用它,例如:

// here: read image to I...
Mat edges = ImageProcessing.cannyEdges(I, 20, 100);
Mat lines = ImageProcessing.getHoughLines(I);

// draw lines...

问题是:I是否属于对象的状态?转换为非静态然后使用例如是否有意义:

// here: read image to I...
ImageProcessing IP = new ImageProcessing(I);
IP.cannyEdges(20, 100); // CHANGE OF cannyEdges: Also save `edges` internally as property!?
IP.calcHoughLines(); // also save the lines internally maybe?
Mat lines = IP.getLines();

// draw lines...

这样更好吗?问题又来了:例如,我应该在内部存储 getHoughLines()(即 lines)的结果,还是应该直接将其返回给调用者!?

最佳答案

我可以举一些例子:

public class Multiplier {
private int number;

public Multiplier(int number) {
this.number = number;
}

public int multiply(int other) {
return number * other;
}
}

这个类可以像这样被实例化:

Multiplier multiplyByTwo = new Multiplier(2);

我可以用它来将列表中的许多元素乘以 2。

但我可能需要将数字对相乘。所以下面的类(class)可能是我需要的:

public class Multiplier {       
public static int multiply(int number, int other) {
return number * other;
}
}

我可以将其设为静态,因为不需要任何状态。

这个例子可以在列表中像这样使用:

for (int x:listOfInts) {
print(Multiplier.multiply(x * 2));
}

但在这种特定情况下,第一个示例可能更好。

for (int x:listOfInts) {
print(multiplyByTwo(x));
}

或者更好地与 Java 8 ''map'' 一起使用

如果我需要在我的代码中的许多点获取乘法的元素和结果,我可以做到。

class Multiplier {
private int x;
private int y;

public int multiply() {
return x * y;
}
// getters and setters for x and y
}

在最后一种情况下,我可能会考虑不添加 setter 并在构造函数中传递 x、y。

每种结构都可以在某些特定情况下使用。

关于Java:什么时候使用属性,什么时候使用方法参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22701070/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com